[Программирование] Структурное против ООП программирование
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Доброго времени суток. В этой статье я хочу показать не то, чем лучше структурное программирование или объектное, а то как нужно писать и там и там. И возможно это послужит выбором для тех, кто только хочет начать программировать и не знает какой язык выбрать и что может быть удобней. Я взял за пример языка 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;
}
Если статья понравиться, то я буду писать продолжение в будущем. Пока я ещё наверное плохо знаю ООП, чтобы написать больше примеров, но думаю, что если не заброшу ООП, то начинающим читателям будет интересно посмотреть отличия при написании в структурном и ООП-программировании.
===========
Источник:
habr.com
===========
Похожие новости:
- Выпуск NTP-серверов NTPsec 1.2.0 и Сhrony 4.0 с поддержкой защищённого протокола NTS
- [Big Data, Java, Scala] Big Data Tools EAP 11: Zeppelin в DataGrip и spark-submit во всех поддерживаемых IDE
- [Программирование, Dart, Flutter] Релиз Dart 2.10: на шаг ближе к null-safety (перевод)
- [Agile, Удалённая работа] Как мы ВИРТУАЛЬНО спланировали работу 140 человек на квартал вперед, находясь в разных точках Земного шара
- [Хостинг, IT-инфраструктура, Хранение данных, Исследования и прогнозы в IT, IT-компании] Сравнение услуг colocation
- [Гаджеты, Смартфоны] Пользователи жалуются на проблемы с Microsoft Surface Duo — смартфон сбрасывает звонки, а его рамки желтеют
- [Big Data, Java, Scala] Big Data Tools Update 11 Is Out
- [Разработка под Android] Автоматический Code Improvement при коммите в Android Studio
- [Гаджеты, Компьютерное железо, Настольные компьютеры, Разработка на Raspberry Pi] VMware ESXi на Raspberry Pi: они реально это сделали
- [Разработка веб-сайтов, JavaScript, ReactJS] Почему мы выбрали MobX, а не Redux, и как его использовать эффективнее
Теги для поиска: #_programmirovanie (Программирование), #_c, #_java, #_programmirovanie (
Программирование
)
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 14:30
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Доброго времени суток. В этой статье я хочу показать не то, чем лучше структурное программирование или объектное, а то как нужно писать и там и там. И возможно это послужит выбором для тех, кто только хочет начать программировать и не знает какой язык выбрать и что может быть удобней. Я взял за пример языка 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; } Если статья понравиться, то я буду писать продолжение в будущем. Пока я ещё наверное плохо знаю ООП, чтобы написать больше примеров, но думаю, что если не заброшу ООП, то начинающим читателям будет интересно посмотреть отличия при написании в структурном и ООП-программировании. =========== Источник: habr.com =========== Похожие новости:
Программирование ) |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 14:30
Часовой пояс: UTC + 5