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

بعد خمس سنوات برمجة ! لم أعد أفقه في البرمجة شيئا!

بدأه linuxbybelkacem في 23 مارس 2011 · 4 رد · 1,020 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله تعالى وبركاته أما بعد

فأنا اليوم عرفت أني مبتدئ ولا أفقه الا نقطة في بحر البرمجة باستخدام لغة c++ , هاهي القصة الكاملة

بدأت برمجة الجرافيكس منذ 3 سنوات تقريبا وكنت أستخدم C++ فقط وذلك لسرعة التنفيذ و اعتمداها على المؤشرات والمرجعيات الى البرمجة الكائنية التوجه

وخلال هذه المدة كنت قرأت عدة كتب لهذه اللغة وأصبحت أستخدمه بسلاسة كبيرة وتعلمت كل شيئ مذكور في الكتاب من أساسيات اللغة والمؤشرات والبرمجة الكائنية التوجه

الا أنه كان لدي مركب نقص في تلك اللغة وكنت أشعر بأن هناك شيئا ما ناقصا لم أستطع ايجاده , المهم تابعت برمجة الجرافيكس الا أن وقعت الكارثة

أردت استخدام مكتبة CEGUI حملت المكتبة وأنجزت أول مثال لي عليها وكل شيء كان يجري على مايرام

عند تعريف كائن ما كان المثال يستخدم الكود

Direct3D10Render &Render = ...........

وهذا التعريف كان يستخدم داخل الدالة أما اذا عرفته خارج الدالة فسيظهر لك خطأ أن المرجع لم يتم تهيئته.

المشكلة الأولى أني أردت أن أعرف المرجع داخل صنف ثم أهيؤه بعد ذلك في دالة من دوال الصنف فعجزت تماما . فوضعت سؤالا في موقع المكتبة فدلوني على

الرابط التالي هاهو رابط حل المشكلة

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

typedef int& A;
const A aref = 3;;

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

أخذتني العزة وحملت مجموعة كتب مخترع اللغة بحد ذاته Bjarne Stroustrup

وأنا أقرِها الآن فوصلت الى فصل البرمجة الكائنية التوجه ووجدت النصائح التالية

[

a] If you can think of ‘‘it’’ as a separate idea, make it a class.

If you can think of ‘‘it’’ as a separate entity, make it an object of some class.

[c] If two classes have a common interface, make that interface an abstract class.

[d] If the implementations of two classes have something significant in common, make that

commonality a base class.

[e] If a class is a container of objects, make it a template.

[f] If a function implements an algorithm for a container, make it a template function implementing

the algorithm for a family of containers.

[g] If a set of classes, templates, etc., are logically related, place them in a common namespace.

[2] When you define either a class that does not implement either a mathematical entity like a

matrix or a complex number or a low-level type such as a linked list:

[a] Don’t use global data (use members).

Don’t use global functions.

[c] Don’t use public data members.

[d] Don’t use friends, except to avoid [a] or [c].

[e] Don’t put a ‘‘type field’’ in a class; use virtual functions.

[f] Don’t use inline functions, except as a significant optimization.

وقد أردت تطبيق النصيحتين التاليتين

[

d] If the implementations of two classes have something significant in common, make that

commonality a base class.

If two classes have a common interface, make that interface an abstract class

.

فلطالما استخدمت الأصناف في البرمجة وهذه نصاءح مفيدة لاستخدامها ولأني كنت أتغاضى عن مفهوم الوراثة ولا أستخدمه الا نادرا ( حسنا سأكون صريحا معكم لم أستخدمه طوال حياتي البرمجية !!!)

وأيضا لم أكلف نفسي عناءا الفهم الجيد التجريد و ماهيته كما لم أعر اهتماما لتتحميل الزائد للمعاملات ( بالرغم من فهمي الجيد للتحميل الزائد للدوال ) أصبت بخيبة أمل كبيرة جدا جدا

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

حتى أني أصبحت كل يوم أرى شيئا جديدا في اللغة لم أألفه من قبل وهذه بعض الأمثلة

[int 'head'


int function () const

وأحيانا أخرى أحمل أكواد مبرمجين آخرين وأقرِها ولا أفهم منها شيئا!!!!!!!!!

هل ألوم الكتاب العرب على عدم وجود كتب تهتم بالتعمق في لغة سي++ وشرح الأفكار المتقدمة نسبيا أم ألوم نفسي أم من ألوم

بالله عليكم كيف أكسب مهارات جديدة هل من مساعدة لوجه الله أريد أن أتعلم وأصبح من أفضل المبرمجين في العالم ( أو على الأقل فهم الكود المكتوب من قبل المبرمجين )

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

1-OOP

2-POINTER & Refernce

3- مواضيع متقدمة في اللغة والتقنيات المستخدمة والمواقع وأي شيء يمكن أن يصقل مهاراتي ويطورها ( هذا اذا كانت لدي مهارة أصلا)

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

والسلام عليكم ورحمة الله تعالى وبركاته

تم تعديل هذه المشاركة بواسطة linuxbybelkacem في 23 مارس 2011 في 15:48

1
#2

أعتقد انك بدأت بداية خاطئه بعدم دراستك لأساسيات اللغه و إتقانها قبل البدء فى البرمجه الفعليه، إليك بعض الخطوات التى قد تساعدك:

1 - إبدء بمعرفة ما هى المتغيرات و كما يتم إستخدامها و ما الفرق بين التصريح عنها و إستخدامها، أيضا قم بمعرفة انواع البيانات الإفتراضيه باللغه (إبتعد عن المؤشرات و المصفوفات الأن). قم بالتدرب جيدا عليهم و اجعل كل الكود داخل الداله main

2 - انت الأن تعرف المتغيرات بشكل جيد (على ما اعتقد) لذا الخطوه التاليه هى ان الثوابت، إدرسها جيدا و قم بالتطبيق عليها.

3 - بعد معرفتك للمتغيرات و الثوابت أبدء بدراسة الـ scope (كل هذا من داخل الداله main) و ذلك عن طريق إستخدام الأقواس { و } إعرف ما المقصود بمدى تعريف المتغيرات و كيف يمكنك استخدام متغيرات داخل مدى أعلى (هنا ستتعرف على scope resolution).

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

5 - تعرف على معاملات الدوال جيدا و انواع التمرير مثل التمرير بالمرجع و التمرير بالقيمه و علاقة الكلمه const بالمعاملات (حتى الأن ابتعد عن المؤشرات)، أيضا ستحتاج لمعرفة مفهوم المعاملات الإختياريه و كيف تستطيع جعل معامل إختيارى (أى إذا لم يقم المستخدم بتمرير قيمه له يتم تمرير قيمة تم تحديدها مسبقا)، و لا تنسى الأهم من معرفتك لكل هذه الأمور هو ان تطبق و تكتب بيديك لا تنسخ و تلصق الكود، كلما كتبت بيديك و اخطئت كلما زادت معرفتك و خبرتك باللغه.

6 - الأن و قد عرفت الدوال و معاملاتها ستنتقل للخطوه التاليه و هي بدراسة مفهوم overloading، ستحتاج لتعرف كيف تقوم به و كيف تستخدم الدوال المعرفه بإسم واحد، أيضا ستحتاج لفهم كيف يتعرف المترجم على الداله التى تريد إستدعائها.

7 - فى هذه الخطوه ستتعرف على مفهوم المصفوفات و كيف تقوم بالتصريح عنها و كيف تقوم بإستخدامها.

8 - فى هذه الخطوه ستحتاج لدراسة مفهوم المؤشرات، ما هي و فيما تستخدم و فيما الإستفاده منها.

9 - فى هذه الخطوه ستحتاج لدراسة حجز و تحرير الذاكره و المصفوفات الديناميكيه و مفهوم النصوص.

10 - فى هذه الخطوه ستدرس علاقة المؤشرات بالثوابت و كيف يتم تعريفهم و كيف يتم إستخدامهم.

11 - فى هذه الخطوه ستعود للدوال لدراسة تمرير مؤشر للداله، و ستحتاج لمعرفة كيف يتم تمرير مؤشر بالقيمه و بالمرجع و ما الفرق بينهم، أيضا ستتعرف على علاقة الكلمه const عند مع معامل من نوع مؤشر.

12 - فى هذه الخطوه ستدرس الكلمه static و ماذا تعنى عند تعريفك لمتغير بها على مستوى الملف او على مستوى الداله.

13 - فى هذه الخطوه ستتعرف على مفهو التحويل بين انواع البيانات المختلفه و هذا يشمل معرفتك لإسلوب التحويل القديم بالإضافة للمعامل static_cast و const_cast.

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

و الله ولي التوفيق

1

مدونتي: C++ Tips and Tricks

#3

شكرا أخي على الرد , ولكن أظن أنك لم تفهمني فالنصائح التي قدمتها لي أتقنها تماما وكدليل على ذلك سأكتب مثال لكل نصيحة , وصحح لي ان كان هناك أي خطأ

اقتباس
- إبدء بمعرفة ما هى المتغيرات و كما يتم إستخدامها و ما الفرق بين التصريح عنها و إستخدامها، أيضا قم بمعرفة انواع البيانات الإفتراضيه

int variable ; // declare

viod main ()
{
variable = .... // using !!
}

//virtual type are : int , float , bool , char , double , long , short , unsigned , signed

اقتباس
الخطوه التاليه هى ان الثوابت

const int a = 20 ;

اقتباس
- بعد معرفتك للمتغيرات و الثوابت أبدء بدراسة الـ scope (كل هذا من داخل الداله main) و ذلك عن طريق إستخدام الأقواس { و } إعرف ما المقصود بمدى تعريف المتغيرات و كيف يمكنك استخدام متغيرات داخل مدى أعلى (هنا ستتعرف على scope resolution).

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

تعرف على معاملات الدوال جيدا و انواع التمرير مثل التمرير بالمرجع و التمرير بالقيمه ;

float sqrt ( float x , float &result ) ; //declare

float sqrt ( float x , float &result )

{

result = x*x ; 
return result

}

اقتباس
- فى هذه الخطوه ستعود للدوال لدراسة تمرير مؤشر للداله، و ستحتاج لمعرفة كيف يتم تمرير مؤشر بالقيمه و بالمرجع و ما الفرق بينهم، أيضا ستتعرف على علاقة الكلمه const عند مع معامل من نوع مؤشر.

12 - فى هذه الخطوه ستدرس الكلمه static و ماذا تعنى عند تعريفك لمتغير بها على مستوى الملف او على مستوى الداله.

13 - فى هذه الخطوه ستتعرف على مفهو التحويل بين انواع البيانات المختلفه و هذا يشمل معرفتك لإسلوب التحويل القديم بالإضافة للمعامل static_cast و const_cast.

هنا لدي بعض الضعف ( وليس عدم معرفة ) سأدرسها في الحين

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

وهل لاحظت أيضا أن كل ماتعلمته لا يشبه السطر التالي في أي شيئ

int 'head'

وممكن شرح السطر التالي

int function () const
#4

عزيزي,

المبرمجون الذين يعرفون ++C عن ظهر قلب يعدون على الأصابع في هذا العالم... تتكلم عن Stroustrup و Koeings و Herb Sutter المسؤول عن كل شاردة و واردة في الـ Parallelism في أي تقنية تنتجها Microsoft و Scott Meyers... و البعض الآخر! جميعنا نتعلم اللغة و هناك أمور كثيرة مفصلة في المقاييس لا تحتاج لمعرفتها إلا لو صادف استخدام هذه الميزة في مكتبة معينة كما حصل في حالتك. لذلك لا تقلق و حاول قدر المستطاع الاطلاع على كتب Stroustrup و مقالاته و على مقالات الأسماء المذكورة في الأعلى.

هناك سؤال سئل في Stackoverflow و بصراحة الردود كانت تعبر عن الحقيقة! الموضوع مخفي هناك و لكن لي حق الوصول إليه :sleep:

اقتباس
When can you put “C++ Expert” on your CV?
اقتباس
The day you can really write 'C++ Expert' on your resume and mean it, you wouldn't need to have a resume.
اقتباس
I think it still stands what Herb Sutter once wrote back in 1997:
اقتباس

C++ is a wonderful language that I enjoy using daily. At the moment, it's my primary programming language. It has drawbacks compared to other languages I've used: for example, it has no real module system, and no standard garbage collection. It also has solid features available in few or no other languages: for example, its flexible templates support completely new styles of generic programming. Bottom line, C++ has more power than any of us can handle all at once. I doubt that there are more than half a dozen people on the planet (and I have specific names in mind here) who are true experts in the entirety of C++, from the core language to all the facets (pun intended) of the standard library. Most of the rest of us can only aspire to know a few narrow areas in depth and the whole reasonably well.

Fortunately, there's no need for us to all be Stroustrups or Koenigs to get concrete benefits from C++. Just avoid the dusty corners of the language, and remember that cuteness hurts in many ways. Above all, "write what you know, and know what you write," and you'll certainly do well!

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 24 مارس 2011 في 03:01

3
#5

شكرا أخي على الرد والله لقد أعدت الي ثقتي بنفسي :cool: :cool:

حسب مافهمت من مشاركتك أن البرمجة كالبناء كل ما زادت مهاراتك في اللغة كل مارتفع مستوى بنائك ولكن الأساس يبقى في القاعدة الجيدة وأساسيات اللغة .

يعني بالبسيط المختصر يجب ألا أيأس وأتعلم ما يواجهني في هذه اللغة دون أن أنقص من نفسي فبالنهاية لاشيء يأتي ببساطة

اقتباس
المبرمجون الذين يعرفون ++C عن ظهر قلب يعدون على الأصابع في هذا العالم... تتكلم عن Stroustrup و Koeings و Herb Sutter المسؤول عن كل شاردة و واردة في الـ Parallelism في أي تقنية تنتجها Microsoft و Scott Meyers...

عند قراءة هذه الأسطر بالذات تبادرت الي التالي

وفوق كل ذي علم عليم

اقتباس
حاول قدر المستطاع الاطلاع على كتب Stroustrup و مقالاته و على مقالات الأسماء المذكورة في الأعلى.

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

اقتباس
و البعض الآخر

ممكن أسماء البعض الآخر :ohmy: :ohmy: :blush: :blush: :lol: :lol:

شكرا أخي

تم تعديل هذه المشاركة بواسطة linuxbybelkacem في 24 مارس 2011 في 11:50

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

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

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

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

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