الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ما هو أكثر المفاهيم غموضاً حول ++c برأيك ؟!

رائج
بدأه Khaled.Alshaya في 17 يوليو 2009 · 63 رد · 7,609 مشاهدة · في قسم المواضيع الهامة في قسم السي /سي++
مشاركة: واتساب X فيسبوك تيليجرام
#26
اقتباس
هذا الكود مع أنه سيعمل الا انك لا تعرف ماذا سيحدث اذا مررت type مثل Person أو MyClass و هنا الفرق, ففي اللغات الأعلى يكون المترجم حريص على أن يكون الكود صحيحاً ليس فقط Syntactically بل أيضاً Symantically قدر المستطاع

كله إلا الـ metaprogramming الله يرضى عليك :P

في Java و #C, الـ Generics استحدثت لتحل مشكلة واحدة "تقريباً" هي جعل الـ data structure في المكتبات القياسية generic...

لو تذكر الطريقة القديمة كانت جميع العناصر يجب أن تكون وارثة من Object, و ما صاحبها من boxing و unboxing... في Java حتى الآن هذه المشكلة, بينما في #C أعتقد تم تفاديها.

غير ذلك الـ Generics ليس لها فائدة.

في ++C, الأمر مختلف تماماً, هذا الشيء يسمى بأسلوب الـ policies .. أي التعاقد بين كود المستخدم و كود المكتبة :)

في ++C أنت تقوم بكتابة الخوارزمية باستخدام الـ templates و من ثم استخدامها مع أي نوع تحب, ليس هناك قيود و لا حواجز, و لو كان هناك خطأ, سيتم اكتشافه لحظة الترجمة لأنه لا وجود للـ templates أصلاً في الكود النهائي على عكس #C و Java.

كيف ستقوم بكتابة reverse بـ Java أو #C دع عنك assign من boost باستخدام الـ generics :)

post-89451-1248108695_thumb.png

أما التأكد من أن الكود صحيح المعنى فلايوجد مترجم على سطح الأرض يمكنه إخبارك بذلك طالما أن الكود صحيح من الناحية النحوية,

template <class T>
T addTwoVariables(const T& first, const T& second)
{
	return first + second;
}

إذا لم تقم بتعريف المعامل '+' للـ Person أو MyClass فسيصدر خطأ وقت الترجمة بكل بساطة!

تحياتي ...

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 20 يوليو 2009 في 19:54

#27
اقتباس
لا تدعم مبدأ الinterface

ارجو توضيح الفرق بينة وبين interface الخاص بالكلاس (نقوم بانشائة بشكل اختيارى) عندما نعزل interface من تفاصيل الكلاس

بحيث تكون تفاصيل الفانكشن الخاصة بالكلاس فى ملف .cpp وملف interface الخاص بالكلاس فى .h ويحوى prototype الفانكشن وايضاء الداتا.

اقتباس
الشئ الاخر هي أنها لم تعطي و لو حتى تلميح على كيفية تطوير الواجهة الرسومية و لم تعطي أيضاً أي طريقة قياسية للMulti Threading و هو بالاضافة الى ضعف الframework المصاحب لها و الذي لا يحوي سوى أساسيات الأساسيات فلا يوجد دعم للشبكات أوالتشفير أو التعامل مع الصور و الوسائط المتعددة و غيرها من المميزات و هي التي جعلت ال++C محصورة في برمجة النظم و جعلت الكود صعب التنفيذ على نظم تشغيل مختلفة.

اذا اعتبرت ان c# لغة وان .net هى implementation الخاصة بها فلدى c++ الكثير من الimplementation القوية واشملهم هى qt وايضاء .net متاحة(ولكن البعض لايفضلها لان السى # انسب) وهناك الكثير من المكتبيات التى تقوم بالاغراض المذكورة

اقتباس
مبدأ الfriend و هو برأيي أكبر خطأ لأنه يقضي على مبدأ الencapsulation و هو أهم مبدأ في الOOP .

راى الشخصى انها موجودة بشكل احتياطى

فهل اذا احتجت ان اكسر مبادى oop بشكل بسيط وهو friend والذى هو ايضاء معرف فى interface الكلاس (لم اشتت نفسى اذن ) فاين الخطاء الذى ارتكبتة و هل مبادى oop تستحق ان نمنع اى شخص من اختراقها حتى لو بارادتة

name : mohamedyosry

#28

شاكرة اهتمامك اخي خالد...

معلومات بجد قيمة و ممتازة

:happy:

موفق يارب

bye

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#29

لا أدري كيف لم أرى رد الأخ متميز الأول رغم أنه أشار لبعض النقاط المهمة :)

اقتباس
أعتقد أن مشكلة ال++C في انها ظهرت في فترة وسيطة لم تكن فيها الObject Oriented هي الاسلوب العام للبرمجة و أيضاً لم يكن الGUI أو الواجهة الرسومية هي الطريقة الأكثر انتشاراً لعمل الUI و لهذا هي في النهاية تقف في منتصف الطريق بين الprocedural programming و الObject oriented كما أنها تعتمد طريقة في الOOP غير كل اللغات الأخرى فهي تدعم الMulit class inheritance و لا تدعم مبدأ الinterface كما أنها اللغة الوحيد التي تدعم (أو ربما ابتدعت) مبدأ الfriend و هو برأيي أكبر خطأ لأنه يقضي على مبدأ الencapsulation و هو أهم مبدأ في الOOP .

البرمجة الكائنية "كما" تعرفها اليوم هي من قلب ++C, و إن كنت تحسب أنك تبرمج بطريقة كائنية في #C فاسمحلي بأن أقول لك بأنك تبرمج "بطريقة" ++C.

ليس هناك شيء اسمه البرمجة الكائنية, هناك عدة مفاهيم مختلفة, لايمكن للغة واحدة جمعها معاً :)

إن كنت تحب أن تلقي نظرة على مدارس OOP...

و البرمجة الكائنية قديمة جداً, ظهرت مع البرمجة الإجرائية و ليست حديثة كما تعتقد! و ++C هي التي عرضتها! لا أدري ماهي اللغة التي تعرفها و فيها OOP قبل ++C ؟

من برأيك إن لم يكن Stroustrup هو الذي شهر البرمجة الكائنية ؟!

الـ Interfaces في ++C موجودة! pure virtual classes!

و الـ Interfaces بمفهومها الحالي في #C و Java استحدثت لحل مشكلة و ليست ميزة, لأنه لايوجد multiple inheritance. أعرف أنك ستقول مضرة :lol:

حسناً مضرة إن لم تعرف كيف تستخدمها, و لكنها الأداة الصحيحة في بعض التصاميم... لماذا تمنع المبرمجين من استخدامها ؟

ماذا عن friend ؟ هل تعتقد أنها تقضي على مفهوم الـ encapsulation ؟

في #C و Java هناك نظرية تقول بأن كل method يجب أن تتبع class, و أن استخدام الدوال "الحرة" تصميم سيء!

ألا ترى أن هذا يقضي على مبدأ التغليف نفسه ؟

أردنا تصميم class, في java و #C نقوم برمي "جميع" الدوال في واجهة الكائن نفسه. ماذا لو كانت هناك دالة تعمل على كائنين من نوعين مختلفين ؟ و تحتاج للوصول إلى التمثيل الداخلي لأحدهما أو كلاهما ؟ هذه هي فائدة friend!

هل نضعها في الأولى أم في الثانية..

هل نضع في واجهة الكائن الدوال الضرورية, التي تحتاج إلى الوصول إلى تمثيل الكائن الداخلي, أم نرمي كل ما له علاقة و ما ليس له علاقة ؟

القول بأن friend تدمر التصميم الكائني هو قول خاطئ, لأننا نقوم ببناء الكائنات ضمن واجهات صغيرة نتحكم فيها بشكل كبير, و من ثم نقوم ببناء abstractions فوق ذلك, و ليس كل شيء يوضع في واجهة الكائن نفسه.

أعرف أن الـ Classes في #C و Java بها مئات الدوال! لماذا هذا الشيء ؟ لماذا لا يتم بناء Abstractions لتسهيل المهمة ؟

وجود البرمجة الكائنية في لغة هو ملاحظة حول اللغة, و ليس ميزة. و لا يعني أن اللغة إذا كانت كائنية أنها جيدة و لا يعني أنها ليست كائنية أنها ليست جيدة. "إلا في بروشورات التسويق"

حتى أسلوب البرمجة الكائنية الذي تتحدث عنه لم يستطع أن يحل أحد أهم و أسهل المشاكل, هل تستطيع تصميم data structure عملية فقط بـ OOP ؟

حتى #C و Java تخلطان الأساليب!

البرمجة الـ Multiparadigm هي التفوق بحد ذاته. أما أن اللغات النقية التي سمعنها عنها كثيراً, فهي ليست بالمستوى المطلوب أصلاً.

عموماً, ليس لدي تعليق حول نقطة الـ UI, هناك frameworks كثيرة لـ ++C. يمكنك اختيار ما تشاء منها.. أما جعل إحداها standard فلا أدري مالفائدة من الـ UI في PS3 أو wii أو في محرك Google أو في Amazon,

أو للتحكم في محرك محرك غواصة نووية, أو في المسبار الذي حط على المريخ ؟

ليست لغة برمجة تطبيقات سطح المكتب فقط ؟ أغلب الأعمال التي تتم بـ ++C هي كتابة المكتبات و ليس إنشاء التطبيقات.

اقتباس
الشئ الاخر هي أنها لم تعطي و لو حتى تلميح على كيفية تطوير الواجهة الرسومية و لم تعطي أيضاً أي طريقة قياسية للMulti Threading و هو بالاضافة الى ضعف الframework المصاحب لها و الذي لا يحوي سوى أساسيات الأساسيات فلا يوجد دعم للشبكات أوالتشفير أو التعامل مع الصور و الوسائط المتعددة و غيرها من المميزات و هي التي جعلت ال++C محصورة في برمجة النظم و جعلت الكود صعب التنفيذ على نظم تشغيل مختلفة.

يا أخي و الله موجودة من زماااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااا

ااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااا

اااااااااااان!

ألقي نظرة على boost لو سمحت :)

أعلم أن NET. و مكتبات Java توفر الكثير, و لكن ليس بجودة لا تصميم و لا كفاءة مكتبات ++C القياسية بأي شكل من الأشكال! اتفقنا ؟

نحن نتحدث عن المكتبات القياسية فقط,

أنت تتحدث عن المكتبات ؟ صحيح ؟ دقيقة, تقول أنه لا يتوفر لـ ++C مكتبات جيدة ؟ :huh:

bsdiff, bspatch, bzip2, dtoa, hunspell, ICU, JSCRE, libjpeg, libpng, libxml, libxslt, LZMA SDK, modp_b64, Mozilla interface to Java Plugin APIs, npapi, nspr, nss, Pthreads for win32, sqlite, tlslite, V8 assembler, WebKit, WTL, zlib

أتمنى أن تخبرني ماهو البديل عن هذه المكتبات المستخدمة في Google Chrome لوحده ؟ و هل يوجد سواء في المكتبة القياسية أو غير القياسية بديل ؟ لا بأس فقط Webkit, اتفقنا ؟

بالنسبة للنقطة الأخيرة, نظرة على منتجات Mozilla المفتوحة المصدر و التي تعمل على أكثر من 25 منصة و المكتوبة بـ ++C بشكل شبه كامل ينقض هذا الكلام. ++C تعمل على أنظمة أكثر من التي يعمل عليها JVM دع عنك NET.

تحياتي ...

#30
اقتباس
إذا لم تقم بتعريف المعامل '+' للـ Person أو MyClass فسيصدر خطأ وقت الترجمة بكل بساطة

و هنا تأتي المشكلة, فلا يوجد شئ في تعريف الTemplate يقول أن أي Class أو Type يجب أن يدعم الOperator +

اقتباس
ارجو توضيح الفرق بينة وبين interface الخاص بالكلاس (نقوم بانشائة بشكل اختيارى) عندما نعزل interface من تفاصيل الكلاس

بحيث تكون تفاصيل الفانكشن الخاصة بالكلاس فى ملف .cpp وملف interface الخاص بالكلاس فى .h ويحوى prototype الفانكشن وايضاء الداتا

أنا أقصد الinterface في الjava و ال#C و هو تعريف واجهة الobject دون الخوض في تفاصيله و هو يعمل كContract بين أجزاء الكود و الcomponents المختلفة

اقتباس
لو تذكر الطريقة القديمة كانت جميع العناصر يجب أن تكون وارثة من Object, و ما صاحبها من boxing و unboxing... في Java حتى الآن هذه المشكلة, بينما في #C أعتقد تم تفاديها.

الحال مختلف نسبياً في #C فالprimitive types تعمل الى حد ما مثل ال++C فهي تحفظ في الstack segment و يمكنك تمرير المتغيرات byref و لكن مازال الboxing/unboxing يحدث عن التحويل بين reference و value types. كما أنك لا يمكن أن تعرف متغير Reference على الStack.

اقتباس
كيف ستقوم بكتابة reverse بـ Java أو #C دع عنك assign من boost باستخدام الـ generics

هكذا

	class Program
	{
		static void Main(string[] args)
		{
			List<int> x = new List<int>();
			x.Reverse();

			List<string> y = new List<string>();
			y.Reverse();

			List<MyClass> my = new List<MyClass>();
			my.Reverse();
		}

	}

	public class MyClass : IComparable<MyClass>
	{
		public int data = 0;
		#region IComparable<MyClass> Members

		public int CompareTo(MyClass other)
		{
			return data.CompareTo(other.data);
		}

		#endregion
	}

اقتباس
أما التأكد من أن الكود صحيح المعنى فلايوجد مترجم على سطح الأرض يمكنه إخبارك بذلك طالما أن الكود صحيح من الناحية النحوية

أنا معك أن المترجم لا يستطيع فعل هذا في المطلق و لكن الSymantic Checks أفضل في ال#C منها في ال++C و في ال++C منها في الC و من بعض هذه الأمثلة LINQ فهنا المترجم يلعب دور كبير في فهم ما تريد تحقيقه و تحويله الى Expression يمكن عمل Optimization له في الRuntime ليناسب بيئة العمل.

اقتباس
البرمجة الكائنية "كما" تعرفها اليوم هي من قلب ++C, و إن كنت تحسب أنك تبرمج بطريقة كائنية في #C فاسمحلي بأن أقول لك بأنك تبرمج "بطريقة" ++C.

ليس هناك شيء اسمه البرمجة الكائنية, هناك عدة مفاهيم مختلفة, لايمكن للغة واحدة جمعها معاً

إن كنت تحب أن تلقي نظرة على مدارس OOP...

و البرمجة الكائنية قديمة جداً, ظهرت مع البرمجة الإجرائية و ليست حديثة كما تعتقد! و ++C هي التي عرضتها! لا أدري ماهي اللغة التي تعرفها و فيها OOP قبل ++C ؟

من برأيك إن لم يكن Stroustrup هو الذي شهر البرمجة الكائنية ؟!

البرمجة الكائنية موجودة في لغات قبل ال++C فهي موجودة في Smalltalk من السبعينات كما أن أول لغة C قدمت الOOP كانت Objective-C على أجهزة NeXT في الثمانينات ثم تلتها بعد ذلك ال++C و التي أعتمدت على دعم كود الC لضمان الانتشار و هذا ما جعلها تتخذ قرارات غريبة لتلبية هذه الاحتياجات.

اقتباس
ماذا عن friend ؟ هل تعتقد أنها تقضي على مفهوم الـ encapsulation ؟

في #C و Java هناك نظرية تقول بأن كل method يجب أن تتبع class, و أن استخدام الدوال "الحرة" تصميم سيء!

ألا ترى أن هذا يقضي على مبدأ التغليف نفسه ؟

كيف؟؟ اذا كنت تقصد الHelper Methods فيمكنك عمل Helper classes لتنظيم و تجميع هذه الmethods و الحد من الname collisions و التي تحدث كثيراً في ال++C عندما تجد عدة دوال بنفس الاسم عندما تقوم بتضمين ملف جديد لمشروعك.

اقتباس
أردنا تصميم class, في java و #C نقوم برمي "جميع" الدوال في واجهة الكائن نفسه. ماذا لو كانت هناك دالة تعمل على كائنين من نوعين مختلفين ؟ و تحتاج للوصول إلى التمثيل الداخلي لأحدهما أو كلاهما ؟ هذه هي فائدة friend!

هل نضعها في الأولى أم في الثانية..

لا يوجد سبب يجعل الوصول للتمثيل الداخلي للclass شئ صحيح, في الحالة التي تذكرها يوجد حلول كثيرة و أغلبها تجدها في Design Patterns فهذه المشاكل يتم تفاديها أساساً بوضع تصميم جيد.

اقتباس
القول بأن friend تدمر التصميم الكائني هو قول خاطئ, لأننا نقوم ببناء الكائنات ضمن واجهات صغيرة نتحكم فيها بشكل كبير, و من ثم نقوم ببناء abstractions فوق ذلك, و ليس كل شيء يوضع في واجهة الكائن نفسه.

أعرف أن الـ Classes في #C و Java بها مئات الدوال! لماذا هذا الشيء ؟ لماذا لا يتم بناء Abstractions لتسهيل المهمة ؟

مرة أخرى هذا ليس سبب لوجود مبدأ الfriend. كما أن الfriend في حد ذاته يخرق الabstraction لأن هناك من يتحكم في الinternal state من خارج الclass.

و هذا أحد أقوال Linus Travolds عن ++C في رد كتبه بعنوان "C++ is a horrible Language" و أنه شخصياً يفضل C عليها

اقتباس
C++ leads to really really bad design choices. You invariably start using

the "nice" library features of the language like STL and Boost and other

total and utter crap, that may "help" you program, but causes:

- infinite amounts of pain when they don't work (and anybody who tells me

that STL and especially Boost are stable and portable is just so full

of BS that it's not even funny)

- inefficient abstracted programming models where two years down the road

you notice that some abstraction wasn't very efficient, but now all

your code depends on all the nice object models around it, and you

cannot fix it without rewriting your app.

المصدر1.

المصدر2

اقتباس
حتى أسلوب البرمجة الكائنية الذي تتحدث عنه لم يستطع أن يحل أحد أهم و أسهل المشاكل, هل تستطيع تصميم data structure عملية فقط بـ OOP ؟

حتى #C و Java تخلطان الأساليب

ما المشكلة في تصميم DataStructure بالOOP ؟ أعطني مثال؟

اقتباس
البرمجة الـ Multiparadigm هي التفوق بحد ذاته. أما أن اللغات النقية التي سمعنها عنها كثيراً, فهي ليست بالمستوى المطلوب أصلاً.

أنا معك, لكن ++C تخلط بين الno paradigm programming الذي تتبعه C و الobject Oriented.

اقتباس
عموماً, ليس لدي تعليق حول نقطة الـ UI, هناك frameworks كثيرة لـ ++C. يمكنك اختيار ما تشاء منها.. أما جعل إحداها standard فلا أدري مالفائدة من الـ UI في PS3 أو wii أو في محرك Google أو في Amazon,

أو للتحكم في محرك محرك غواصة نووية, أو في المسبار الذي حط على المريخ ؟

أنا أعرف أن هناك عشرات و مئات بل الاف المكتبات و لكن المشكلة في عدم وجود مكتبية قياسية قوية. كل اللغات لها مكتبات كثيرة, لكن الjava و ال#C المكتبات القياسية أقوى كثيراً من مثيلتها في الC

اقتباس
ألقي نظرة على boost لو سمحت

هل Boost مكتبة قياسية ؟ بمعنى هل لزاماً على أي بيئة تطوير لل++C على أي نظام أن تدعمها ؟

اقتباس
ليست لغة برمجة تطبيقات سطح المكتب فقط ؟ أغلب الأعمال التي تتم بـ ++C هي كتابة المكتبات و ليس إنشاء التطبيقات.

اذن مع الوقت سينحصر استخدامها أكثر خاصة مع تطور باقي التقنيات.

اقتباس
أعلم أن NET. و مكتبات Java توفر الكثير, و لكن ليس بجودة لا تصميم و لا كفاءة مكتبات ++C القياسية بأي شكل من الأشكال! اتفقنا ؟

نحن نتحدث عن المكتبات القياسية فقط,

أعذرني لا أتفق معك في تصميم مكتبات ال++C و أيضاً لا توجد اساسيات مثل مكتبات الشبكات و الThreading و الMultimedia و غيرها من الأساسيات.

كما أن القدرة على استخدام الMeta programming شئ مهم لا تستطيع ال++C عمله بنفس القدرة التي تقوم به اللغات مثل #C و Java

اقتباس
بالنسبة للنقطة الأخيرة, نظرة على منتجات Mozilla المفتوحة المصدر و التي تعمل على أكثر من 25 منصة و المكتوبة بـ ++C بشكل شبه كامل ينقض هذا الكلام. ++C تعمل على أنظمة أكثر من التي يعمل عليها JVM دع عنك NET.

تحياتي ...

يا أخي اللغة فقط و مكتبتها المحدودة هي التي تعمل على جميع المنصات (و أحياناً المكتبة لا تكون كاملة) و لكن في الjava مثلاً يمكنك حرفياً كتابة الكود و تحويله bytecodeو تنفيذه على أكثر من نظام دون حتى الحاجة الى اعادة بناء الكود على النظام الجديد, و البرنامج يحتوي GUI و Threading و Networking و و و

تم تعديل هذه المشاركة بواسطة motamayez في 20 يوليو 2009 في 23:59

مصري في بلاد الفرنجة.

قريباً اقرأ مقالاتي على It-scoop

#31

السلام عليكم ...

أخي العزيز, عندما أدخل في نقاش معك حول ++C, فدائماً أجد إجابات عامة, و ليس عن تجربة مع ++C صراحة,

اقتباس
انت لم تفهمني. أنا أقصد Object لا يدعم الOperator + ...

لم أفهم ماذا تقصد بهذا.

اقتباس
أنا أقصد الinterface في الjava و ال#C و هو تعريف واجهة الobject دون الخوض في تفاصيله و هو يعمل كContract بين أجزاء الكود و الcomponents المختلفة

pure virtual class فقط اسم مختلف.

اقتباس
الحال مختلف نسبياً في #C فالprimitive types تعمل الى حد ما مثل ال++C فهي تحفظ في الstack segment و يمكنك تمرير المتغيرات byref و لكن مازال الboxing/unboxing يحدث عن التحويل بين reference و value types. كما أنك لا يمكن أن تعرف متغير Reference على الStack.

دع عنك هذا الأمر.

أنا لم أقل كيف تستخدم دالة اسمها reverse في data structure معينة.

أنا قلت كيف تكتب reverse "مرة" واحدة, و تستخدمها بعد ذلك على "أي" data structure.... لايهم إن كان list أو map أو hashSet أو غيره,

المهم, كيف تكتب دالة "مرة واحدة" تستطيع تطبيقها على جميع الـ containers... و على الـ containers التي لم تقم بكتابتها بعد.

كما هو الحال في boost التي أنشئت بعد STL و جميع خوارزميات STL تعمل معها ببساطة, الجميع.

انظر إلى الكود في مشاركتي السابقة, أنا استخدمت string و list و vector و عاملتهم بنفس الطريقة. و الكلام ينطبق على جميع الـ Containers الموجودة في STL و Boost و حتى التي تريد إنشائها بنفسك.

كل ما في الأمر أن هناك sort واحدة و reverse واحدة count واحدة و هكذا.

اقتباس
أنا معك أن المترجم لا يستطيع فعل هذا في المطلق و لكن الSymantic Checks أفضل في ال#C منها في ال++C و في ال++C منها في الC و من بعض هذه الأمثلة LINQ فهنا المترجم يلعب دور كبير في فهم ما تريد تحقيقه و تحويله الى Expression يمكن عمل Optimization له في الRuntime ليناسب بيئة العمل.

جميل, أتفق معك في أن LINQ ميزة لـ #C على Java.. و لكن في ++C يمكنك كتابة DSL داخل اللغة نفسها عن طريق مكتبات (بالطبع المكتبات تتم عن طريق خبراء :) ).

انظر إلى spirit كمثال لكتابة EBNF, و إلى xpressive لكتابة regex... داخل ++C كلغة DSL كما تعامل LINQ. دون تعديل اللغة نفسها. و المكتبة نفسها تقوم بعمل Optimization للكود الذي كتبته. و الأخطاء عبارة عن compile-time errors

اقتباس
كيف؟؟ اذا كنت تقصد الHelper Methods فيمكنك عمل Helper classes لتنظيم و تجميع هذه الmethods و الحد من الname collisions و التي تحدث كثيراً في ال++C عندما تجد عدة دوال بنفس الاسم عندما تقوم بتضمين ملف جديد لمشروعك.

namespaces.

عندما تكتب ::

std::cout << "Standard Name Space";

std هي المجال القياسي.

اقتباس
البرمجة الكائنية موجودة في لغات قبل ال++C فهي موجودة في Smalltalk من السبعينات كما أن أول لغة C قدمت الOOP كانت Objective-C على أجهزة NeXT في الثمانينات ثم تلتها بعد ذلك ال++C و التي أعتمدت على دعم كود الC لضمان الانتشار و هذا ما جعلها تتخذ قرارات غريبة لتلبية هذه الاحتياجات.

صحيح, و لكن Smalltalk و Objective C هما المدرسة الثانية في OOP. و لو كنت خبير الخبراء فيهما فستجد أن المفاهيم التي تعلمتها لا تمت بصلة لما تقوم به في Java و #C و ++C صاحبة المدرسة الثانية.

اقتباس
ما المشكلة في تصميم DataStructure بالOOP ؟ أعطني مثال؟

لماذا تم إضافة الـ Generics إلى Java و #C ؟ هي اسلوب مختلف و ليست من البرمجة الكائنية في شيء.

اقتباس
أنا معك, لكن ++C تخلط بين الno paradigm programming الذي تتبعه C و الobject Oriented.

البرمجة الكائنية جيدة في حل أنواع من المشاكل و سيئة في أنواع أخرى من المشاكل. أن يكون تصميم برنامجك كائني لايجعله جيد. هذا يعود لطبيعة المشكلة نفسها, بعضها يعبر عن كائنات, و البعض الآخر لا يعبر.

++C لغة متعددة الأساليب, و مفهوم البرمجة الكائنية أصبح قديماً حتى لدى مبرمجي ++C, هو أداة في الجعبة و ليس كل شيء. الآن معظم الجهود تتجه نحو الـ Metaprogramming و الـ functional.

اقتباس
أنا أعرف أن هناك عشرات و مئات بل الاف المكتبات و لكن المشكلة في عدم وجود مكتبية قياسية قوية. كل اللغات لها مكتبات كثيرة, لكن الjava و ال#C المكتبات القياسية أقوى كثيراً من مثيلتها في الC

لست من مبرمجي C, و لكن بالفعل المكتبات القياسية صغيرة جداً. و لكن ماهي البيئة القياسية لـ ++C و C... تعملان في كل مكان! كيف ستقوم بتوحيد كل تلك البيئات ؟

الأمر سهل مع NET. و Java و لكنه صعب جداً عندما تتحدث عن C و ++C.

اختر الـ framework المناسب للبيئة التي تقوم بالبرمجة فيها.

اقتباس
هل Boost مكتبة قياسية ؟ بمعنى هل لزاماً على أي بيئة تطوير لل++C على أي نظام أن تدعمها ؟

Boost تعمل على منصات و مترجمات أكثر مما يحلم به أي محترف. و ليست مكتوبة بواسطة "موظفين في شركة". Boost خرجت من تحت أيدي خبراء في البرمجة, خبراء مترجمات, خبراء لغات برمجة, علماء حاسوب...

عندما تقارن تصاميم Boost و حلولها مع ما يوجد في NET. و Java فأنت تظلمها.

و نعم إن كنت مبرمج ++C فهي قياسية... و كاتبوها أغلبهم أعضاء في لغة ++C القياسية, و الآخرون من حول العالم,

و هي حرة للاستخدام التجاري و الغير التجاري, ليس هناك قيود. و هناك مكتبات منتقاة اختيرت لإكمال STL.

اقتباس
اذن مع الوقت سينحصر استخدامها أكثر خاصة مع تطور باقي التقنيات.

أكيد, استخدامها لغير إنشاء المكتبات أو الأنظمة عملية غير عقلانية,

عندما أريد web development فالطبع لن أستخدم ++C, و بكل رحابة سأستخدم NET. لأنها توفر الكثير.. عندما أريد بناء تطبيقات خاصة كالبرامج المحاسبية و قواعد البيانات, هناك لغات توفر تسهيلات كثيرة لا توفرها ++C في مجالاتها المتخصصة.

اقتباس
أعذرني لا أتفق معك في تصميم مكتبات ال++C و أيضاً لا توجد اساسيات مثل مكتبات الشبكات و الThreading و الMultimedia و غيرها من الأساسيات.

لا أدري لماذا يجب أن تكون المكتبة قياسية.

هناك الكثير من المكتبات الحرة للاستخدام التجاري و الحر, و كلها مكتبات عالمية, بكل تأكيد أقوى, هل تقارن مكتبات يستخدمها photoshop و chrome و مكتبة كـ gmp المستخدمة في mathematica و غيرهم! بمكتبات NET.

هناك آلالف المكتبات ذات الجودة العالية, و ++C ليست من النوع الذي يحتاج إلى دعاية في هذا الأمر فهي لغة المكتبات!

عندما تقول لي بأنه لا يوجد مكتبات للشبكات و الـ multimedia في ++C فهذا ليس خاطئاً فحسب, بل جرح للمشاعر :lol:

هل نظرت إلى Qt ؟ حسناً لا مشكلة, ماهي اللغة التي كتبت بها البرامج التالية ؟ VLC , Media Player , Real Player..

بأي لغة كتب Direct X, ماهي التقنية التي يستعملها Windows 7 لمكوناته ؟ COM و أنت تقوم بعمل wrapper لبعض الأدوات في NET. لا أكثر.

اقتباس
كما أن القدرة على استخدام الMeta programming شئ مهم لا تستطيع ال++C عمله بنفس القدرة التي تقوم به اللغات مثل #C و Java

أي Metaprogramming ؟؟؟ لايوجد أصلاً Metaprogramming في #C و Java :)

اقتباس
يا أخي اللغة فقط و مكتبتها المحدودة هي التي تعمل على جميع المنصات (و أحياناً المكتبة لا تكون كاملة) و لكن في الjava مثلاً يمكنك حرفياً كتابة الكود و تحويله bytecodeو تنفيذه على أكثر من نظام دون حتى الحاجة الى اعادة بناء الكود على النظام الجديد, و البرنامج يحتوي GUI و Threading و Networking و و و

و الله يا أخي عجيبة, إذا كانت الـ JVM في 99% من المنصات مكتوبة بـ ++C, فكيف تكون ++C ضعيفة من هذه الناحية, و كيف هناك نقص في المكتبات ؟!

و مكتبات ++C لاتكون كاملة ؟ هذه غريبة, انظر إلى المكتبات الشهيرة لـ ++C, و انظر من يقوم ببرمجتها! خبراء العالم و ليس موظفون في شركة! و تقول ناقصة, هل حصل أن جربت مكتبة ناقصة في ++C ؟!

تحياتي ...

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 21 يوليو 2009 في 01:33

#32

نقاش جميل لكن ...

ما أحب أن أنقاش الفروق بين اللغات لأن الكلام لن ينتهي , لماذا ؟ لإنه إن كنا نريد المقارنة بين لغتين إثنتين من نفس المستوى فسوف تكون المقارنة على نفس الخط , لكن إختلاف مستوى اللغات سيجعل النقاش متشعب وغير منتهي مالم نحدد منطقة معينة .... مثل الtemplate أو OOP وغيرها ... وقتها نستطيع المقارنة بين لغتين حتى لو كانت مختلفتين تمام ... مثل PHP و ++C ...

بالنسبة للنقاش ما بين ++C وJava و #C ... فما أتمنى يكون النقاش متشعب بينهم , مقارنة Java و #C منطقية , لكن مقارنة أي واحده منهم مع ال++C فهي غير منطقية تمام ... لغة ++C هي أعم وأشمل من أن تقارنها بأي لغة ... وتستطيع بها عمل أي شئ تريد نزولاً إلى مستوى الهاردوير وصعوداً إلى مستوى التطبيقات ... وقس عليها ...

فالـTemplate في لغة ++C هو أعم وأكبر وأكثر مرونة من باقي اللغات التي تدعمه ... وهذه المرونة يصاحبها صعوبة لبعض المبرمجين الغير متمرسين ... لكنها تعطي المبرمجيين المحترفين دفعه قوية ومرونة كبيرة جداً عند كتابتهم لها ...

على العموم الحديث يطول , وبأختصار أنا أصمم تطبيقات سطح المكتب بلغة #C , لأنها أسهل وهو المجال الذي تتمرس فيه هذه اللغة بشكل كبير , لكن يمكن صنع نفس التطبيق بلغة ++C لكن لماذا تستخدم المطرقة الكبيرة لضرب المسمار الصغير ...

تم تعديل هذه المشاركة بواسطة b.m.s في 21 يوليو 2009 في 00:48

1
#33

لا أريد أن أكون ثرثاراً :)

و لكن هناك نقطتان,

النقطة الأولى, هي أن ++C تخرق مبدأ التغلف بـ friend و هذا شيء غير صحيح.

و الشيء الآخر هو الوراثة المتعددة, و أنها سيئة, و لا يجب استعمالها على الإطلاق,

عموماً هذا المفهومان, إن كنت غريباً عن ++C, لابد أن تخاف منهما بسبب الدعاية القائمة من لغات الشركات. و لكن إن شاء الله إن أعطانا الله العمر, لابد أن نستعرضهما في أمثلة :)

ليس في هذا الموضوع, لأن الكلام سيكون حول مفهوم ++C في البرمجة الكائنية بشكل عام.

الأمر الآخر,

Linus مبرمج كغيره, و عن نفسي لست من المعجبين به. لا لشيء شخصي, و لكن لأنه ليس قطباً برمجياً برأيي, هي الدعاية التي حصلت و جعلته أشهر من نار على علم,

رغم أن المبرمج الحقيقي لما تراه الآن هو Stallman. و خبرته على العين و الراس و لكنه كاتب 2% من النواة, هذا لا يلغي مجهوده و لكن ليعرف قدره. لا ليس لأنه لا يحب ++C :lol:

إضافة إلى لهجته البذيئة في الكلام, لم يذكر حتى سبباً واحداً.

===================================

كلام سليم أخ بندر :)

تحياتي ...

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 21 يوليو 2009 في 00:45

#34
اقتباس
انت لم تفهمني. أنا أقصد Object لا يدعم الOperator +

اسف عدلت المشاركة, أقصد أن تعريف الTemplate لم يذكر أن أي Type مستخدم يجب أن يدعم ال+

اقتباس
أي Metaprogramming ؟؟؟ لايوجد أصلاً Metaprogramming في #C و Java

يوجد في الدوت نت على الأقل و لكن ليس مباشرة في #C و هو عن طريق الEmit أو CodeDOM اذا كنت تريد الانتحار, أما لغة #F و التي تعمل تحت نفس المنصة فهي تدعم الMeta Programming

اقتباس
لا أدري لماذا يجب أن تكون المكتبة قياسية.

هناك الكثير من المكتبات الحرة للاستخدام التجاري و الحر, و كلها مكتبات عالمية, بكل تأكيد أقوى, هل تقارن مكتبات يستخدمها photoshop و chrome و مكتبة كـ gmp المستخدمة في mathematica و غيرهم! بمكتبات NET.

هناك آلالف المكتبات ذات الجودة العالية, و ++C ليست من النوع الذي يحتاج إلى دعاية في هذا الأمر فهي لغة المكتبات!

عندما تقول لي بأنه لا يوجد مكتبات للشبكات و الـ multimedia في ++C فهذا ليس خاطئاً فحسب, بل جرح للمشاعر

هناك نقطة لا تفهمها عندما اتكلم عن أهمية وجود مكتبات قوية مع اللغة هو لأن ليست كل المشاريع يمكنها تضمين مكتبات تحت GPL أو اي رخصة مشابهه و هي في النهاية مشاريع Closed Source أو لأي سبب اخر. فهناك الكثير من الأحيان يكون تفادي المكتبات مفتوحة المصدر لأسباب قانونية و هنا تتمنى أن تكون المكتبة القياسية أكبر لأنها ستغنيك عن هذا كله.

اقتباس
أخي العزيز, عندما أدخل في نقاش معك حول ++C, فدائماً أجد إجابات عامة, و ليس عن تجربة مع ++C صراحة,

أنا خبرتي مع ++C ليست بنفس خبرتي مع C أو #C و أنا أجد أن ++C يمكن تشبيهها بالمثل

It is like mermaid, when you want a fish you find a woman, when you want a woman you find a fish

يمعنى أنها ليست لغة Object oritented كاملة كالJava و لا لغة بسيطة كالC بل هي تقف في المنتصف و تحاول اكتساب مميزات الاثنين و تنتهي بعيوب الاثنين

مصري في بلاد الفرنجة.

قريباً اقرأ مقالاتي على It-scoop

#35
اقتباس
يمعنى أنها ليست لغة Object oritented كاملة كالJava و لا لغة بسيطة كالC بل هي تقف في المنتصف و تحاول اكتساب مميزات الاثنين و تنتهي بعيوب الاثنين

أخي من أين لك هذه المعلومة ؟

Java تدعم البرمجة الكائنية أفضل من ++C ؟! صراحة أول مرة أسمع هذا الكلام!

Java لا تسمح للمبرمج بغير الأسلوب الكائني, و ليست كائنية أكثر من ++C!

ماهي المميزات الموجودة في #C و Java ؟

OOP

Exceptions

C-Style

هذه كلها مأخوذة من ++C, مع عمل ريجيم لتسهيل تلك اللغات لبناء تطبيقات في مجالات معينة لا أكثر.

هدية مجاناً :)

الورقة الأولى, ماهي البرمجة الكائنية, whatis.pdf

الورقة الثانية, لماذا ++C ليست كائنية فقط, oopsla.pdf

الورقة الثالثة, 16 طريقة مختلفة لكتابة stack في ++C مع مقارنة بسيطة,اعتبره show للغة للتعرف عليها stack_cat.pdf

من مخترع اللغة,

تحياتي ...

#36
motamayez كتب:
يمعنى أنها ليست لغة Object oritented كاملة كالJava و لا لغة بسيطة كالC بل هي تقف في المنتصف و تحاول اكتساب مميزات الاثنين و تنتهي بعيوب الاثنين

أخي المتميز

لماذا عند المميزات نقول أنها تحاول , لكن عند العيوب نقول أنها حصلت ؟ لماذا لا نقول مثلاً أنها أكتسبت مميزات اللغتين وحصلت على عيوب اللغتين ... لكن هذا غير صحيح ...

لم تحاول لغة ++C تقليد أي لغة فهي بدأت بتطبيق المفاهيم قبل اللغات الأخر وبعدها بسنين تبدأ اللغات الأخر بتطبيق مفاهيمها لكن ليس بنفس مرونتها ... فالـ OOP والTemplate والMetaprogramming و غيرها طبقت في ال++C قبل أن تظهر هذه اللغات , وبعد ظهورها بسنين حاولت أن تفعل ما فعلته ال++C لكنها لم تستطع ...

الTemplate لم يظهر في لغات الIntermidate كود إلا مؤخراً , لكن هل تقارنه بالTemplate الموجود في ال ++C , لا طبعاً ...

حتى لغة C أخذت من لغة ++C الكثير ... ولا أحتاج إلى مثال مادمت مبرمج C ...

الذي تستطيع أن تقول أنها حاولت تقليد لغتين وأنتهت بعيوبهم ولم تحصل على مميزاتهم هي C++.NET , فهي حاولت تقليد ++C مع أن تعمل على منصة NET. ... وإنتهت بلغة ممسوخة قلما قلما قلما تجد لها تطبيق على الإنترنت ...

تم تعديل هذه المشاركة بواسطة b.m.s في 21 يوليو 2009 في 01:15

#37
اقتباس
Java تدعم البرمجة الكائنية أفضل من ++C ؟! صراحة أول مرة أسمع هذا الكلام!

بالطبع فالدعم ليس معناه أن أستطيع أن أكتب Class الدعم بمعنى أن أن تكون المكتبة أيضاً مثال على استخدام الOOP و هنا كل من #C أو Java أفضل لأن المكتبة نفسها مصممة على أسس الOOP و لكن لن تجد مزيج من الAPI's التي بعضها مصمم بالOOP و البعض مصمم بلا شئ مجرد function في مكتبة. كل هذا يؤدي الى بناء ثقافة غير منظمة حول اللغة.

اقتباس
الذي تستطيع أن تقول أنها حاولت تقليد لغتين وأنتهت بعيوبهم ولم تحصل على مميزاتهم هي C++.NET , فهي حاولت تقليد ++C مع أن تعمل على منصة NET. ... وإنتهت بلغة ممسوخة قلما قلما قلما تجد لها تطبيق على الإنترنت ...

الC++.net هي كارثة بكل المقاييس, و السبب الأكبر هو محاولة اضافة مميزات للغة تكاد تنفجر من التعقيد, و الهدف الأساسي هو أن مبرمجين ال++C كانوا يريدون بعض المميزات التي تقدمها ال.net للغات الأخرى مثل الGarbage Collection و الClass Library و أيضاً لتكون هناك طريقة لاستخدام مكتبات مكتوبة بال#C مع كود ال++C و لكن المشكلة أنها تعقدت جداً جداً

اقتباس
حتى لغة C أخذت من لغة ++C الكثير ... ولا أحتاج إلى مثال مادمت مبرمج C ...

كيف ؟؟؟

مصري في بلاد الفرنجة.

قريباً اقرأ مقالاتي على It-scoop

#38
اقتباس
بالطبع فالدعم ليس معناه أن أستطيع أن أكتب Class الدعم بمعنى أن أن تكون المكتبة أيضاً مثال على استخدام الOOP و هنا كل من #C أو Java أفضل لأن المكتبة نفسها مصممة على أسس الOOP و لكن لن تجد مزيج من الAPI's التي بعضها مصمم بالOOP و البعض مصمم بلا شئ مجرد function في مكتبة. كل هذا يؤدي الى بناء ثقافة غير منظمة حول اللغة.

هل تتحدث عن STL ؟!

اقتباس
كيف ؟؟؟

C التي تعرفها ليست C الأصلية يا عزيزي, ما تبرمج به هو strong type C ! و هل كانت C في يوم من الأيام strong type لولا ++C

صدقني لو أريتك بعض أكواد الـ C القديمة ربما لن تعرف أنها C أصلاً :)

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 21 يوليو 2009 في 01:27

#39

السلام عليكم,

اقتباس
بالطبع فالدعم ليس معناه أن أستطيع أن أكتب Class الدعم بمعنى أن أن تكون المكتبة أيضاً مثال على استخدام الOOP و هنا كل من #C أو Java أفضل لأن المكتبة نفسها مصممة على أسس الOOP و لكن لن تجد مزيج من الAPI's التي بعضها مصمم بالOOP و البعض مصمم بلا شئ مجرد function في مكتبة. كل هذا يؤدي الى بناء ثقافة غير منظمة حول اللغة.

أحيانا لن تكون الـ OOP هي الأنسب لحل المشكلة

فلماذا تريد تقييد المبرمج بالـ OOP في حين يكون هناك أسلوب أنسب لحل المشكلة؟

تم تعديل هذه المشاركة بواسطة MoHammaD_93 في 21 يوليو 2009 في 01:28

SAFETY TIP : Always delete what you new, and free what you malloc, never mix new with free or malloc with delete.

#40
Khaled.Alshaya كتب:

هل تتحدث عن STL ؟!

الSTL مصممة بالOOP لكن هل هي المكتبة القياسية الوحيدة التي تستخدمها و هل تقدم لك كل ما تريد؟؟ بل تستخدمها في نفس الوقت مع الC standard library و مكتبات اخرى ؟؟ و لأن ال++C تسمح بوجود Global functions و أيضاً Macros و غيرها من المبادئ السيئة التي ورثتها من الC فالنتيجة أكواد غير مقروءة و تعقيد لا فائدة منه

كما أن الSTL نفسها فيها design inconsistency فمثلاً الC++ string غير مستخدم في بعض الapi's و التي تطلب c-style string مثل الfstream و لماذا لم تحاول ال++C التخلص من الc-style string بدلاً من وجود أكثر من طريقة لعمل شئ بسيط بل هذا السبب البسيط فتح الباب أمام عمل أكثر من نوع للstring في مكتبات أخرى, في حين أن المشكلة ببساطة لا توجد في الjava أو ال#C أو أي لغة أخرى لأنه من البداية تم اعطاء الانطباع أن هناك طريقة واحدة للstring.

مصري في بلاد الفرنجة.

قريباً اقرأ مقالاتي على It-scoop

#41

السلام عليكم...

Qt مكتبة قياسية هندسية عالية الجودة للغة ++C

و كل الأصناف classes معمولين بطريقة OOP و بلغة ++C.

موفقين

bye

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#42

اخوي انا الشي اللي ينرفزني و يربكني اهو الـ multiple inheritance خصوصا لو دشينا بالـ virtual inheritance لإزالة الـ diamond problem خصوصا لو كنت تسويها بأسفل شجرة التوارث...... باختصار... روح انتحر احسن لك

اما بالنسبة للغة كاستخدام فماكو شي غامض بالنسبة

:::كوت بو 6:::

IDE : Microsoft Visual Studio 2005 Pro

#43
اقتباس
الSTL مصممة بالOOP لكن هل هي المكتبة القياسية الوحيدة التي تستخدمها و هل تقدم لك كل ما تريد؟؟ بل تستخدمها في نفس الوقت مع الC standard library و مكتبات اخرى ؟؟ و لأن ال++C تسمح بوجود Global functions و أيضاً Macros و غيرها من المبادئ السيئة التي ورثتها من الC فالنتيجة أكواد غير مقروءة و تعقيد لا فائدة منه

STL لن ترى فيها لا وراثة و لا تعدد أشكال من الذي تعرفه!

ببساطة ليست OOP, و ببساطة أيضاً أفضل مكتبة Data Structure موجودة في العالم! هل يصبح التصميم سيئاً إن لم يكن OOP ؟!

STL مبنية فوق مفهوم الـ Data Abstraction و الـ Generic Programming و الـ Functional Programming... و لولا الـ templates لما كان تصميم STL ممكناً بهذه الطريقة,

مميزات STL التي ظهرت في 1995 حتى الآن مكتبات Java و #C تحاول تقليدها دون نجاح! و مع cpp0x سيصبح الأمر شبه مستحيل, كيف تقوم بتعريف comparator للدالة sort في لغتك المفضلة و سأريك كيف تقوم بها STL :)

و الحكم للجمهور في الطريقة الأفضل و الأوضح و الأسرع!

و STL مكتبة خوارزميات و Data Structure لا يتوفر لا في Java و لا في #C مثلها, أعطني البديل عنها. مالديك هو أساسيات الأساسيات!

و STL تعتمد على مفهوم الـ free functions, يعني الـ global functions التي يكرهها -ولا أدري لماذا- مبرمجو اللغات الكائنية النقية,

طيب أخبرني, حسب قواعد OOP أين يقع الـ class المسمى math ؟!

عبارة عن مجموعة دوال ليس لها علاقة ببعض, استخدم شيء اسمه class في تلك اللغات لجمع تلك الدوال دون سبب واضح, لعدم وجود الأدوات الضرورية لفصل الـ Abstractions عن توزيع الـ classes و الدوال في مجموعات منطقية.

أنت تعتقد أن تصميم NET. كائني و لكنه ليس كذلك, فيه خروقات من أول المكتبة إلى آخرها, هو يستخدم الشيء المسمى class كثيراً لجمع الدوال في مجموعات ليس لها علاقة ببعضها أكثر من تطبيق مفاهيم OOP نفسها!

اقتباس
الC++.net هي كارثة بكل المقاييس, و السبب الأكبر هو محاولة اضافة مميزات للغة تكاد تنفجر من التعقيد, و الهدف الأساسي هو أن مبرمجين ال++C كانوا يريدون بعض المميزات التي تقدمها ال.net للغات الأخرى مثل الGarbage Collection و الClass Library و أيضاً لتكون هناك طريقة لاستخدام مكتبات مكتوبة بال#C مع كود ال++C و لكن المشكلة أنها تعقدت جداً جداً

حاولت أن تلعب لعبة قذرة بالسيطرة على ++C بسبب شهرة مترجمها... و لكنها فشلت فشلاً ذريعاً.

Microsoft عائدة للسيطرة على عالم ++C بمترجمها الشهير, و هذا هو التطبيق الـ flagship الحقيقي لمنتجات Microsoft و ليس #C في عالم البرمجة :)

تحياتي ...

#44
اقتباس
STL مبنية فوق مفهوم الـ Data Abstraction و الـ Generic Programming و الـ Functional Programming... و لولا الـ templates لما كان تصميم STL ممكناً بهذه الطريقة,

مميزات STL التي ظهرت في 1995 حتى الآن مكتبات Java و #C تحاول تقليدها دون نجاح! و مع cpp0x سيصبح الأمر شبه مستحيل, كيف تقوم بتعريف comparator للدالة sort في لغتك المفضلة و سأريك كيف تقوم بها STL

و الحكم للجمهور في الطريقة الأفضل و الأوضح و الأسرع!

أنا لا يهمني اذا كانت تستخدم تعدد الأوجهة أو لا, المهم أنها ليست دوال في الهواء لا يربطها سوياً شئ, كما أن لها طريقة منطقية في التعلم و منظمة.

بالنسبة للSort ففي ال#C توجد عدة طرق لتمرير الcomparison logic أشهرها 4 طرق

1- أن تجعل اData Type بستخدم الIComparable<T> Interface

و هنا يكون الكود

	class Program
	{
		static void Main(string[] args)
		{
			var myList = new List<MyClass>()
				{
					new MyClass{data = 49},
					new MyClass{data = 354},
					new MyClass{data = 34}
				};
			myList.Sort();


			foreach (var item in myList)
			{
				Console.WriteLine(item.data);
			}
		}

	}

	public class MyClass : IComparable<MyClass>
	{
		public int data = 0;

		public int CompareTo(MyClass other)
		{
			return data.CompareTo(other.data);
		}

	}

2- أن تستخدم Lambda Expression أو delegate في العموم و هنا لا تحتاج أن يكون النوع يستخدم IComparable

و هنا يكون الكود أبسط كثيراً

var myList = new List<MyClass>()
				{
					new MyClass{data = 49},
					new MyClass{data = 354},
					new MyClass{data = 34}
				};
			myList.Sort((x, y)=>x.data.CompareTo(y.data));

3- أو تقوم بفصل عملية الComparison في نوع اخر يتبع IComparer و هنا يكون الكود هكذا

	class Program
	{
		static void Main(string[] args)
		{
			var myList = new List<MyClass>()
				{
					new MyClass{data = 49},
					new MyClass{data = 354},
					new MyClass{data = 34}
				};
			myList.Sort(new MyClassComparer());


			foreach (var item in myList)
			{
				Console.WriteLine(item.data);
			}
		}

	}

	public class MyClass 
	{
		public int data = 0;
	}

	public class MyClassComparer : IComparer<MyClass>
	{
		#region IComparer<MyClass> Members

		public int Compare(MyClass x, MyClass y)
		{
			return x.data.CompareTo(y.data);
		}

		#endregion
	}

و هناك طرق اخرى

مصري في بلاد الفرنجة.

قريباً اقرأ مقالاتي على It-scoop

#45
اقتباس
و STL مكتبة خوارزميات و Data Structure لا يتوفر لا في Java و لا في #C مثلها, أعطني البديل عنها. مالديك هو أساسيات الأساسيات!

أرني دالة أو مكتبة في الSTL تقوم بعمل تشفير سواء symmetric او asymmetric أو حتى خوارزمية ضغط و فك لstreams أو طريقة لنقل الصوت و الصورة أو للتعامل مع الXML؟؟؟

الSTL مجرد بعض الdata structures و الخوارزميات البسيطة و التي لم تتجدد منذ صدورها بالشكل الكافي لتلبية احتياجات المبرمج.

مصري في بلاد الفرنجة.

قريباً اقرأ مقالاتي على It-scoop

#46
اقتباس
طيب أخبرني, حسب قواعد OOP أين يقع الـ class المسمى math ؟!

عبارة عن مجموعة دوال ليس لها علاقة ببعض, استخدم شيء اسمه class في تلك اللغات لجمع تلك الدوال دون سبب واضح, لعدم وجود الأدوات الضرورية لفصل الـ Abstractions عن توزيع الـ classes و الدوال في مجموعات منطقية.

أنت تعتقد أن تصميم NET. كائني و لكنه ليس كذلك, فيه خروقات من أول المكتبة إلى آخرها, هو يستخدم الشيء المسمى class كثيراً لجمع الدوال في مجموعات ليس لها علاقة ببعضها أكثر من تطبيق مفاهيم OOP نفسها!

الحالة ي class Math هي حالة خاصة و هنا هي شبيهة بتجميع الدوال في header file و في هذه الحالة الheader file هو الclass و ان كان استخدام class افضل لأنه يسهل ايجاد الدالة لأنه يسهل على المحرر (أي محرر متطور) ان يجد الدوال بمجرد أن تكتب Math و تتبعها ب.

أما في حالة الheader فعندما تقوم بتضمين الملف اذا لم تكن تعرف مسبقاً اسماء الدوال ستضطر لفتح الheader و البحث عن الدالة المناسبة في حين أن مجرد استخدام class سهل العملية

اسف على الرد في 3 ردود لكن كل مرة انسى نقطة :lol:

تم تعديل هذه المشاركة بواسطة motamayez في 21 يوليو 2009 في 19:29

مصري في بلاد الفرنجة.

قريباً اقرأ مقالاتي على It-scoop

#47
اقتباس
أنا لا يهمني اذا كانت تستخدم تعدد الأوجهة أو لا, المهم أنها ليست دوال في الهواء لا يربطها سوياً شئ, كما أن لها طريقة منطقية في التعلم و منظمة.

و من قال لك أنها في الهواء! هي في الـ namespace الخاص بها!

لا أحب هذا النوع من الحوارات! و لم أشارك في هذا النوع إلا نادراً,

أنت تتكلم عن C و تقول ++C!

#48
اقتباس
من قال لك أنها في الهواء! هي في الـ namespace الخاص بها

الnamespace لا يجب أن تحوي دوال أو متغيرات, الnamespace هي مجرد تجميع للclasses هذا هو الفرق الجوهري الذي تختلف فيه كلاً من ال#C و الjava عن ال++C و الا انتهينا لنفس النقطة, المتغير أو الدالة يجب أن يتبع صنف, غير هذا يعتبر فوضى في لغة المفترض أن Object Oriented

تم تعديل هذه المشاركة بواسطة motamayez في 21 يوليو 2009 في 20:11

مصري في بلاد الفرنجة.

قريباً اقرأ مقالاتي على It-scoop

#49
اقتباس
أرني دالة أو مكتبة في الSTL تقوم بعمل تشفير سواء symmetric او asymmetric أو حتى خوارزمية ضغط و فك لstreams أو طريقة لنقل الصوت و الصورة أو للتعامل مع الXML؟؟؟

الSTL مجرد بعض الdata structures و الخوارزميات البسيطة و التي لم تتجدد منذ صدورها بالشكل الكافي لتلبية احتياجات المبرمج.

STL مكتبة للـ Data Structure و الخوارزميات أرجو أن يكون هذا واضحاً!

و لكن أرجوك, هل أنت جاد في مقارنة مكتبات Net. بمكتبات ++C الشهيرة! :lol: رجاء لا تجعلني أموت من الضحك!

CryptoPP, و أرجو أن تقارنها بالكام خوارزمية تشفير المطبقة في الـ framework الذي أزعجتنا به :lol:

ما رأيك بأن تلقي نظرة على OpenSSL أيضاً,

هل لديك في Net. شيء مثل Intel® Integrated Performance Primitives

اقتباس
أو حتى خوارزمية ضغط

come on!

لم أرى في حياتي شخصاً يطبق خوارزمية ضغط أصلاً بـ Net. حتى تقارنها بمكتبات C و ++C!

اقتباس
و فك لstreams

خلاص سأقتل نفسي!

مالذي تريد فعله بالضبط مع الـ streams ؟

لديك مكتبة iostream لديك مكتبة boost iostream لديك asio للشبكات من boost أيضاً! لا أعتقد أنك تحتاج %1 من ذلك كله.

اقتباس
طريقة لنقل الصوت و الصورة أو للتعامل مع الXML

أين الشمري :blink:

ما حجم المكتبة التي تريدها لـ XML ؟

هل تريد شيئاً على مستوى التطبيقات العملاقة ؟ Xerces من Apache!

هل تريده شيئاً خفيفاً نظيفاً ؟ tinyxml و لا تغرك الصفحة البسيطة له, هذه المكتبة مستخدمة في ++NP و تطبيقات مشهورة أخرى!

اقتباس
الSTL مجرد بعض الdata structures و الخوارزميات البسيطة و التي لم تتجدد منذ صدورها بالشكل الكافي لتلبية احتياجات المبرمج.

خوارزميات بسيطة! أرجوك, أنا تعبت من الكتابة!

عندما تعرف ماهي STL و تعرف أن الـ Collection و الـ Iterators في Java و #C مبنية على طريقة STL, بنسخ مبسطة جداً, وقتها قل خوارزميات بسيطة!

تحياتي ...

#50

أرجو أن تتكلم بطريقة جيدة فأنا أرد على قدر السؤال حتى الان و دون أدنى سخرية.

سبق و قلت استخدام الOpen Source Libraries له تبعات قانونية و التزامات لا تقدر عليه كل الشركات و لهذا عندما تتوفر المكتبات القوية المدعومة مع اللغة توفر الكثير من الجهد و أيضاً تعطي غطاء قانوني و دعم لا توفره المكتبات الأخرى, كما أن المكتبات مفتوحة المصدر موجودة لكل اللغات, نحن هنا نقارن بين التقنيات Out of the Box

اقتباس
و لكن أرجوك, هل أنت جاد في مقارنة مكتبات Net. بمكتبات ++C الشهيرة! رجاء لا تجعلني أموت من الضحك!

طبعاً جاد و المقارنة هنا ليست بين من أفضل, بل بين مكتبة موجودة و غير موجودة, و تلبي الاحتياجات و لا تلبي الاحتياجات. و لست أنا من يقارن بل الشركات و المؤسسات هي التي تقارن و تنتهي لعدم استخدام ال++C في 99% من أعمالها و تلجأ للغات أخرى, حتى الجامعات و الأكاديميات تدرس الJava بالتناظر مع ++C كما في MIT أو Stanford.

اقتباس
لم أرى في حياتي شخصاً يطبق خوارزمية ضغط أصلاً بـ Net. حتى تقارنها بمكتبات C و ++C!

اذا لم تر فهذا ليس مشكلة المكتبة, و مرة اخرى أنا لا أقارن بين مكتبات مفتوحة المصدر في ++C و مكتبات الframework أنا أقول هل يوجد ما يأتي Out of the Box في أي بيئة عمل لل++C ما يلبي هذه الاحتياجات أم لا؟؟ اذا لم يكن هناك اذاً هناك نقص, لأن المكتبات مفتوحة المصدر أو حتى التجارية موجودة في أي تقنية.

اقتباس
CryptoPP, و أرجو أن تقارنها بالكام خوارزمية تشفير المطبقة في الـ framework الذي أزعجتنا به

ما رأيك بأن تلقي نظرة على OpenSSL أيضاً,

قارن بنفسك

http://msdn.microsoft.com/en-us/library/sy...yptography.aspx

اقتباس
هل لديك في Net. شيء مثل Intel® Integrated Performance Primitives

نعم يوجد و هذه ورقة بحث

http://software.intel.com/en-us/articles/i...ers-interoppdf/

و هذا مثال

http://software.intel.com/en-us/articles/i...s-code-samples/

مصري في بلاد الفرنجة.

قريباً اقرأ مقالاتي على It-scoop

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…