Programación estructural versus programación orientada a objetos

Buen día. En este artículo, no quiero mostrar qué está mejor estructurado o la programación de objetos, sino cómo escribir allí y allí. Y quizás esto sirva de elección para aquellos que solo quieren empezar a programar y no saben qué idioma elegir y cuál podría ser más conveniente. Tomé C y JAVA como ejemplo.



Empezaré por lo primero que se me ocurra. Parece no ser un patrón, pero a veces tienes que usarlo en OOP. Primero, escribo un ejemplo en java. Digamos que necesitamos crear una clase para dos tipos de implementación. Por ejemplo, necesitamos crear una clase para conectarnos al sitio a través de http y https. Este es un pequeño ejemplo, por ejemplo, se puede usar el mismo método cuando se desea dibujar para Android en Opengl 2.0 es y Opengl 3.0 es. En este caso, habrá más código, y si lo hace de la forma que le daré, entonces el código se verá normal. Pero este método, por supuesto, no fue inventado por mí, yo mismo lo leí del libro alguna vez. Y entonces https y http. Para hacer esto, necesita crear una interfaz. Y asigne la clase requerida a esta interfaz, según el tipo de protocolo. No recuerdo exactamente, pero parece que he leído en alguna parte que la POO pone el cerebro.Que le permite escribir código hermoso competente. Quizás. Pero casi no programo en OOP, así que tal vez escribo tanto código, pero un programador real hará un código más conciso. Pero quiero mostrarte un ejemplo. Esta es la interfaz de Java.



import java.net.*;
import java.io.*;

interface IProtocol {
	public void connect ( URL url );
	public URLConnection getConnection ( ) throws IOException;
}


Aquí declaramos dos funciones, una para conectarse y la otra para obtener URLConnection. Ahora hay dos clases para que esto funcione.



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 ( );
	}
}


La cantidad de código que necesita escribir en connect y getConnection no es importante. Por ejemplo, he elegido un pequeño código, pero puede ser mucho, si por ejemplo se abre para programar. Pero es conveniente. Entonces, queda la función principal.



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 );

	}
}


Puede usar curl en C y no escribir mucho código, pero ¿cómo podría resolverse este ejemplo usando C? C tiene punteros, ese es su poder. Y aquí hay un ejemplo en C: la función principal.



archivo 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 ( );
}


La estructura de conexión se declara en otro archivo.



archivo 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


Hay un archivo de ámbito completo asignado para init_http, que es necesario para http.



archivo 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;
}


Para init_https, también se necesita ssl. Por lo tanto, este archivo contendrá todos los datos necesarios para esta conexión.



archivo 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;
}


Si te gusta el artículo, escribiré una secuela en el futuro. Por ahora, probablemente no conozca OOP lo suficientemente bien como para escribir más ejemplos, pero creo que si no renuncio a OOP, los lectores principiantes estarán interesados ​​en ver las diferencias al escribir en programación estructurada y OOP.



All Articles