البرمجة الهيكلية مقابل البرمجة OOP

يوم جيد. في هذه المقالة ، لا أريد أن أوضح ما هو أفضل تنظيمًا أو برمجة كائنية ، ولكن كيف أكتب هناك وهناك. وربما يكون هذا بمثابة خيار لأولئك الذين يريدون فقط بدء البرمجة ولا يعرفون اللغة التي يختارونها وما الذي يمكن أن يكون أكثر ملاءمة. أخذت C و JAVA كمثال.



سأبدأ بأول ما يتبادر إلى الذهن. يبدو أنه ليس نمطًا ، لكن في بعض الأحيان يتعين عليك استخدامه في OOP. أولاً ، أكتب مثالاً بلغة جافا. لنفترض أننا بحاجة إلى إنشاء فصل دراسي لنوعين من التنفيذ. على سبيل المثال ، نحتاج إلى إنشاء فصل دراسي للاتصال بالموقع عبر http و https. هذا مثال صغير ، على سبيل المثال ، يمكن استخدام نفس الطريقة عندما تريد الرسم لنظام Android في Opengl 2.0 es و Opengl 3.0 es. في هذه الحالة ، سيكون هناك المزيد من التعليمات البرمجية ، وإذا قمت بذلك بالطريقة التي سأقدمها ، فسيبدو الرمز طبيعيًا. لكن هذه الطريقة ، بالطبع ، لم اخترعها من قبلي ، قرأتها بنفسي من الكتاب في وقت ما. وهكذا https و http. للقيام بذلك ، تحتاج إلى إنشاء واجهة. وتخصيص الفئة المطلوبة لهذه الواجهة ، حسب نوع البروتوكول. لا أتذكر بالضبط ، لكن يبدو أنني قرأت في مكان ما أن OOP يضبط الدماغ.يسمح لك هذا بكتابة كود جيد وفعال. ربما كذلك. لكنني لا أكاد أبرمج في OOP ، ولهذا السبب ربما أكتب الكثير من الأكواد ، والمبرمج الحقيقي سوف يصنع كودًا أكثر إيجازًا. لكني أريد أن أريكم مثالاً. هذه هي واجهة جافا.



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 للبرمجة. لكنها مريحة. لذلك ، تظل الوظيفة الرئيسية.



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

	}
}


يمكنك استخدام curl في C وعدم كتابة الكثير من التعليمات البرمجية ، ولكن كيف يمكن حل هذا المثال باستخدام C؟ لدى C مؤشرات - هذه هي قوتها. وهنا مثال في C - الوظيفة الرئيسية.



ملف 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;
}


إذا أعجبك المقال ، فسأكتب تكملة في المستقبل. في الوقت الحالي ، ربما لا أعرف OOP جيدًا بما يكفي لكتابة المزيد من الأمثلة ، لكنني أعتقد أنه إذا لم أتخلى عن OOP ، فسيكون القراء المبتدئين مهتمين برؤية الاختلافات عند الكتابة في البرمجة المنظمة و OOP.



All Articles