Русский
Русский
English
Статистика
Реклама

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

Доброго времени суток. В этой статье я хочу показать не то, чем лучше структурное программирование или объектное, а то как нужно писать и там и там. И возможно это послужит выбором для тех, кто только хочет начать программировать и не знает какой язык выбрать и что может быть удобней. Я взял за пример языка 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     -1static 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
К списку статей
Опубликовано: 09.10.2020 22:10:21
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Программирование

C

Java

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru