Доброго времени суток. В этой статье я хочу показать не то, чем лучше структурное программирование или объектное, а то как нужно писать и там и там. И возможно это послужит выбором для тех, кто только хочет начать программировать и не знает какой язык выбрать и что может быть удобней. Я взял за пример языка C и JAVA.
Начну с первого, что приходит на ум. Это вроде не паттерн, но в ООП это приходится иногда использовать. Пишу сначала пример на java. Допустим нам нужно создать класс для двух видов реализации. К примеру нам нужно создать класс, чтобы подключаться к сайту по http и https. Это маленький пример, например этот же способ можно использовать, когда ты хочешь для android рисовать и в Opengl 2.0 es и Opengl 3.0 es. В этом случае будет больше кода и если сделать это таким способом, который приведу я, то вид кода будет нормальный. Но этот способ конечно же придумал не я, я его сам вычитал из книги когда-то. И так https и http. Чтобы это сделать, нужно создать интерфейс. И к этому интерфейсу присваивать нужный класс, в зависимости от типа протокола. Я точно не помню, но вроде я где-то читал, что ООП вправляет мозги. Что это позволяет писать грамотный красивый код. Возможно так. Но я почти в ООП не программирую и поэтому может это я так много кода пишу, а настоящий программист сделает более лаконичный код. Но вот хочу показать пример. Вот это интерфейс java.
Здесь мы объявляет две функции, одна для соединения, другая для получения URLConnection. Теперь два класса, чтобы это сработало.
Сколько кода нужно писать в connect и getConnection не важно. Для примера я выбрал мало кода, но его может быть много, если например Opengl es программировать. Но это удобно. Итак, осталась функция main.
На C можно воспользоваться curl и не писать много кода, но как бы этот пример можно было решить средствами C? В C есть указатели — это его сила. А вот пример на C — функция main.
файл main.c
Структура conn объявлена в другом файле.
файл conn.h
Для init_http выделен целый файл с областью видимости, которые нужны для http.
файл http.c
Для init_https дополнительно нужен ssl. Поэтому в этом файле будут все те данные, которые нужны для этого подключения.
файл https.c
Если статья понравиться, то я буду писать продолжение в будущем. Пока я ещё наверное плохо знаю ООП, чтобы написать больше примеров, но думаю, что если не заброшу ООП, то начинающим читателям будет интересно посмотреть отличия при написании в структурном и ООП-программировании.
Начну с первого, что приходит на ум. Это вроде не паттерн, но в ООП это приходится иногда использовать. Пишу сначала пример на 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>
static 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>
static int sockfd;
static 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;
}
Если статья понравиться, то я буду писать продолжение в будущем. Пока я ещё наверное плохо знаю ООП, чтобы написать больше примеров, но думаю, что если не заброшу ООП, то начинающим читателям будет интересно посмотреть отличия при написании в структурном и ООП-программировании.