Strukturelle versus OOP-Programmierung

Schönen Tag. In diesem Artikel möchte ich nicht zeigen, was besser strukturiert ist oder wie man Objekte programmiert, sondern wie man sowohl dort als auch dort schreibt. Und vielleicht ist dies eine Wahl für diejenigen, die nur mit dem Programmieren beginnen möchten und nicht wissen, welche Sprache sie wählen sollen und was bequemer sein könnte. Ich habe C und JAVA als Beispiel genommen.



Ich werde mit dem ersten beginnen, was mir in den Sinn kommt. Es scheint kein Muster zu sein, aber manchmal muss man es in OOP verwenden. Zuerst schreibe ich ein Beispiel in Java. Angenommen, wir müssen eine Klasse für zwei Arten der Implementierung erstellen. Zum Beispiel müssen wir eine Klasse erstellen, um über http und https eine Verbindung zur Site herzustellen. Dies ist ein kleines Beispiel. Beispielsweise kann dieselbe Methode verwendet werden, wenn Sie in Opengl 2.0 es und Opengl 3.0 es für Android zeichnen möchten. In diesem Fall wird es mehr Code geben, und wenn Sie dies so tun, wie ich es gebe, sieht der Code normal aus. Aber diese Methode wurde natürlich nicht von mir erfunden, ich selbst habe sie irgendwann aus dem Buch gelesen. Und so https und http. Dazu müssen Sie eine Schnittstelle erstellen. Weisen Sie dieser Schnittstelle je nach Protokolltyp die erforderliche Klasse zu. Ich erinnere mich nicht genau, aber ich habe anscheinend irgendwo gelesen, dass OOP das Gehirn bestimmt.Damit können Sie kompetenten, schönen Code schreiben. Vielleicht. Aber ich programmiere fast nicht in OOP, also schreibe ich vielleicht so viel Code, aber ein echter Programmierer wird prägnanteren Code erstellen. Aber ich möchte Ihnen ein Beispiel zeigen. Dies ist die Java-Schnittstelle.



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

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


Hier deklarieren wir zwei Funktionen, eine zum Verbinden und die andere zum Abrufen von URLConnection. Jetzt gibt es zwei Klassen, damit dies funktioniert.



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


Wie viel Code Sie in connect und getConnection schreiben müssen, ist nicht wichtig. Zum Beispiel habe ich einen kleinen Code gewählt, aber es kann viel sein, wenn zum Beispiel Opengles programmiert werden. Aber es ist bequem. Die Hauptfunktion bleibt also erhalten.



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

	}
}


Sie können Curl in C verwenden und nicht viel Code schreiben, aber wie könnte dieses Beispiel mit C gelöst werden? C hat Zeiger - das ist seine Kraft. Und hier ist ein Beispiel in C - der Hauptfunktion. main.c



Datei

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


Die conn-Struktur wird in einer anderen Datei deklariert. conn.h



Datei

#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


Für init_http wird eine ganze Gültigkeitsbereichsdatei zugewiesen, die für http benötigt wird.



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


Für init_https wird zusätzlich ssl benötigt. Daher enthält diese Datei alle Daten, die für diese Verbindung benötigt werden.



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


Wenn Ihnen der Artikel gefällt, werde ich in Zukunft eine Fortsetzung schreiben. Im Moment kenne ich OOP wahrscheinlich nicht gut genug, um weitere Beispiele zu schreiben, aber ich denke, wenn ich OOP nicht aufgebe, werden Anfänger daran interessiert sein, die Unterschiede beim Schreiben in strukturierter und OOP-Programmierung zu sehen.



All Articles