Структурное против ООП программирование

от автора

Доброго времени суток. В этой статье я хочу показать не то, чем лучше структурное программирование или объектное, а то как нужно писать и там и там. И возможно это послужит выбором для тех, кто только хочет начать программировать и не знает какой язык выбрать и что может быть удобней. Я взял за пример языка C и JAVA.

Начну с первого, что приходит на ум. Это вроде не паттерн, но в ООП это приходится иногда использовать. Пишу сначала пример на java. Допустим нам нужно создать класс для двух видов реализации. К примеру нам нужно создать класс, чтобы подключаться к сайту по http и https. Это маленький пример, например этот же способ можно использовать, когда ты хочешь для android рисовать и в Opengl 2.0 es и Opengl 3.0 es. В этом случае будет больше кода и если сделать это таким способом, который приведу я, то вид кода будет нормальный. Но этот способ конечно же придумал не я, я его сам вычитал из книги когда-то. И так https и http. Чтобы это сделать, нужно создать интерфейс. И к этому интерфейсу присваивать нужный класс, в зависимости от типа протокола. Я точно не помню, но вроде я где-то читал, что ООП вправляет мозги. Что это позволяет писать грамотный красивый код. Возможно так. Но я почти в ООП не программирую и поэтому может это я так много кода пишу, а настоящий программист сделает более лаконичный код. Но вот хочу показать пример. Вот это интерфейс java.

import java.net.*; import java.io.*;  interface IProtocol { 	public void connect ( URL url ); 	public URLConnection getConnection ( ) throws IOException; } 

Здесь мы объявляет две функции, одна для соединения, другая для получения URLConnection. Теперь два класса, чтобы это сработало.

import java.net.*; import java.io.*;  public class Http implements IProtocol { 	public URL url;  	public void connect ( URL url ) { 		this.url = url; 	}  	public HttpURLConnection getConnection ( ) throws IOException { 		return ( HttpURLConnection ) url.openConnection( ); 	} } 

import java.net.*; import javax.net.ssl.*; import java.io.*;  public class Https implements IProtocol { 	public URL url;  	public void connect ( URL url ) { 		this.url = url; 	}  	public HttpsURLConnection getConnection ( ) throws IOException { 		return ( HttpsURLConnection ) url.openConnection ( ); 	} } 

Сколько кода нужно писать в connect и getConnection не важно. Для примера я выбрал мало кода, но его может быть много, если например Opengl es программировать. Но это удобно. Итак, осталась функция main.

import java.net.*; import java.io.*;  public class Main { 	public static void main ( String[] args ) { 		URL url = null; 		try { 			url = new URL ( "https://www.google.com" ); 		} catch ( MalformedURLException e ) { 			return; 		}  		String protocol = url.getProtocol ( );  		IProtocol prot = null;  		switch ( protocol ) { 			case "http": prot = new Http ( ); break; 			case "https": prot = new Https ( ); break; 			default: return; 		}  		prot.connect ( url );  		URLConnection conn = null; 		try { 			conn = prot.getConnection ( ); 		} catch ( IOException e ) { 			return; 		}  		conn.setDoOutput ( true );  	} } 

На C можно воспользоваться curl и не писать много кода, но как бы этот пример можно было решить средствами C? В C есть указатели — это его сила. А вот пример на C — функция main.

файл main.c

#include <stdio.h> #include "conn.h"  struct conn conn;  #define HTTP_PROTOCOL       1 #define HTTPS_PROTOCOL      2 #define ERROR_PROTOCOL     -1  static int get_protocol ( void ) { 	return HTTP_PROTOCOL; }  int main ( int argc, char **argv ) {  	switch ( get_protocol ( ) ) { 		case HTTP_PROTOCOL: init_http ( &conn ); break; 		case HTTPS_PROTOCOL: init_https ( &conn ); break; 		case ERROR_PROTOCOL: return -1; 	}  	conn.connect ( "www.google.com" ); 	char *data = conn.read ( ); } 

Структура conn объявлена в другом файле.

файл conn.h

#ifndef __CONN__ #define __CONN__ struct conn { 	void ( *connect ) ( const char *url ); 	char *( *read ) ( void ); };  void init_http ( struct conn *conn ); void init_https ( struct conn *conn ); #endif 

Для init_http выделен целый файл с областью видимости, которые нужны для http.

файл http.c

#include "conn.h" #include <sys/types.h> #include <sys/socket.h> #include <stdio.h>  int sockfd;  static void connect_http ( const char *url ) { 	sockfd = socket ( AF_INET, SOCK_STREAM, 0 ); }  static char *read_http ( void ) { 	return NULL; }  void init_http ( struct conn *conn ) { 	conn->connect = connect_http; 	conn->read = read_http; } 

Для init_https дополнительно нужен ssl. Поэтому в этом файле будут все те данные, которые нужны для этого подключения.

файл https.c

#include "conn.h" #include <sys/types.h> #include <sys/socket.h> #include <openssl/ssl.h> #include <stdio.h>  int sockfd; SSL *ssl;  static void connect_https ( const char *url ) { 	sockfd = socket ( AF_INET, SOCK_STREAM, 0 ); }  static char *read_https ( void ) { 	return NULL; }  void init_https ( struct conn *conn ) { 	conn->connect = connect_https; 	conn->read = read_https; } 

Если статья понравиться, то я буду писать продолжение в будущем. Пока я ещё наверное плохо знаю ООП, чтобы написать больше примеров, но думаю, что если не заброшу ООП, то начинающим читателям будет интересно посмотреть отличия при написании в структурном и ООП-программировании.

ссылка на оригинал статьи https://habr.com/ru/post/522816/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *