فكرة جيدة / سيئة فكرة يجب أن Reimplement معظم C++?[مغلقة]

StackOverflow https://stackoverflow.com/questions/637986

سؤال

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

لا تحتاج معظم ما C++ القياسية توفر مكتبة.لذا لماذا لا تنفذ أقل العامة ، ولكن من الأسهل استخدام الإصدار ؟

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

ما أود أن أعرف من ستاكوفيرفلوو المجتمع هو:ما هي المخاطر المحتملة العيوب و المزايا المحتملة إلى "المتداول بلدي" معظم الوظائف الموجودة في C++?

تحرير: أشعر أن الناس قد يساء فهمه لي عن هذه الفكرة.كانت الفكرة أن نفهم ما إذا كان يمكن تنفيذ جدا مجموعة صغيرة من المحكمة الوظيفة التي يتم تبسيطها إلى حد كبير - أكثر كمشروع تعليمي عن هياكل البيانات وما شابه ذلك.أنا لا أقترح إعادة اختراع العجلة بالكامل من الألف إلى الياء, فقط الجزء الذي أريد و تريد معرفة المزيد عن. أعتقد ما أردت معرفته هو ما إذا كان تعقيد باستخدام المحكمة الخاصة بلبنان مذكرات إنشاء أصغر و أبسط نسخة من نفسها.

إعادة استخدام زيادة أو مشابهة.

معظم ما هو رمز الجامعة و نحن لا يسمح لاستخدام المكتبات الخارجية.لذلك إما C++ القياسية المكتبة أو بلدي الطبقات.

الموضوعية في هذه المسألة.

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

تنسيق.

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

و الرجاء...

لا الحروب الدينية.أنا لست من محبي الولد من أي لغة.يمكنني استخدام كل ما هو الواجب التطبيق.الرسومات و ضغط البيانات (ما أنا في هذه اللحظة) التي يبدو أن C++.يرجى تقيد الإجابة على السؤال أو أنها سوف تكون downvoted.

هل كانت مفيدة؟

المحلول

لذا لماذا لا تنفذ أقل العامة ، ولكن من الأسهل استخدام الإصدار ؟

لأنك لا تستطيع.لأن أي شيء آخر قد يقول عن C++, أنها ليست لغة بسيطة, و إذا كنت لا بالفعل جيدة جدا في ذلك ، ربط تنفيذ القائمة سوف تكون عربات التي تجرها الدواب.

بصراحة اختيارك بسيط:

تعلم C++ أو لا يستخدمونه.نعم, C++ تستخدم عادة الرسومات, ولكن جافا مكتبات OpenGL أيضا.فهل C#, Python و تقريبا كل اللغات الأخرى.أو C.لم يكن لديك إلى استخدام C++.

ولكن إذا كنت لا تستخدم ذلك ، تعلم واستخدامه بشكل صحيح.

إذا كنت تريد ثابتة سلاسل, إنشاء سلسلة الخاص بك كما const.

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

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

وبصرف النظر عن أن بعض العيوب الأخرى:

  • لا أحد سوف يفهم التعليمات البرمجية الخاصة بك.إذا كنت اسأل حتى عن الأمراض المنقولة جنسيا::ناقلات ، أو ثنائية الاتجاه التكرار كل شخص على دراية معقولة مع c++ يمكن الإجابة.إذا كنت تسألي عن بلدي::CustomLinkedList, لا أحد يمكن أن تساعدك.وهو أمر مؤسف لأن المتداول الخاصة بك يعني أيضا أنه سيكون هناك المزيد من الأخطاء لطلب المساعدة حول.
  • أنت تحاول علاج الأعراض وليس السبب.المشكلة هي أنك لا تفهم C++.المحكمة الخاصة بلبنان هي مجرد عرض من أعراض هذا.تجنب الخاصة بلبنان لن تجعل سحرية الخاص بك رمز C++ تعمل على نحو أفضل.
  • على أخطاء برنامج التحويل البرمجي.نعم, أنهم سيئة قراءة لكنهم هناك.الكثير من العمل في المحكمة الخاصة بلبنان قد ذهب إلى ضمان استخدام خاطئ سوف تؤدي إلى أخطاء برنامج التحويل البرمجي في معظم الحالات.في C++ فإنه من السهل جدا لجعل التعليمات البرمجية برمجيا ولكن لا يعمل.أو يبدو للعمل.أو يعمل على جهاز الكمبيوتر ولكن فشل في ظروف غامضة في مكان آخر.الخاصة بك قائمة مرتبطة بالتأكيد نقل أكثر أخطاء وقت التشغيل ، حيث يذهبون التي لم يتم كشفها لفترة من الوقت ، يكون من الصعب تعقب.
  • و مرة أخرى, وسوف تكون عربات التي تجرها الدواب.ثق بي.رأيت جيد C++ المبرمجين كتابة قائمة مرتبطة في C++ فقط لكشف علة بعد علة في طمس الحدود الحالات.و C++ كل الحدود الحالات.سوف الخاص بك قائمة مرتبطة التعامل مع استثناء السلامة بشكل صحيح ؟ سيكون ضمان أن كل شيء هو في حالة متناسقة إذا خلق عقدة جديدة (وبالتالي استدعاء كائن نوع منشئ) يلقي استثناء ؟ لا تسرب الذاكرة ، كل مناسبة destructors سوف يكون اسمه ؟ وسوف يكون من النوع آمنة ؟ وسوف تكون performant?هناك الكثير من الصداع التعامل مع عند كتابة حاوية دروس في C++.
  • كنت في عداد المفقودين على واحدة من الأكثر قوة ومرونة المكتبات في الوجود ، أي اللغة.المحكمة الخاصة بلبنان يمكن أن تفعل الكثير من شأنها أن يكون الألم حتى مع جافا العملاقة المتضخمة مكتبة الفئة.C++ من الصعب بما فيه الكفاية بالفعل ، لا تحتاج إلى رمي بعض المزايا التي يوفرها.

أنا لا أهتم allocators, التكرار وما شابه

Allocators يمكن تجاهلها بأمان.كنت الى حد كبير حتى لا تحتاج إلى تعلم أنها موجودة.التكرار رائعة على الرغم من الاعتقاد بها سيوفر لك الكثير من الصداع.هناك فقط ثلاثة مفاهيم تحتاج إلى فهم أن استخدام المحكمة على نحو فعال:

  • الحاويات:كنت تعرف مسبقا عن هذه.ناقلات, القوائم المتصلة, خرائط, مجموعات, طوابير وهلم جرا.
  • التكرار:التجريدات التي تتيح لك التنقل حاوية (أو مجموعات فرعية من وعاء أو أي تسلسل القيمة في الذاكرة على القرص في شكل تيارات ، أو حسابها على الطاير).
  • الخوارزميات:خوارزميات المشتركة التي تعمل على أي زوج من التكرار.لديك النوع ، for_each, العثور على نسخ أخرى عديدة.

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

و لا أنا لست التالية إجابتك تنسيق لأنني اعتقدت فعلا أعطيك إجابة مفصلة سيكون مفيدا أكثر.;)

تحرير:

سيكون من المغري أن أقول أن ميزة المتداول الخاصة بك هو أنك تعلم أكثر من لغة ، وربما السبب في المحكمة الخاصة بلبنان هي واحدة من حفظ النعم..لكني لست مقتنعا أنه صحيح.قد العمل ، ولكن يمكن أن تأتي بنتائج عكسية أيضا.

كما قلت أعلاه, فإنه من السهل أن أكتب C++ كود يبدو إلى العمل.و عندما يتوقف عن العمل ، فإنه من السهل إعادة ترتيب بعض الأمور مثل إعلان النظام من المتغيرات ، أو إدراج قليلا من الحشو في الطبقة لجعلها على ما يبدو العمل مرة أخرى.ما سوف تتعلم من هذا ؟ من شأنها أن يعلمك كيفية كتابة أفضل C++?ربما.ولكن على الأرجح أنه فقط يعلمك أن "C++ سيء".سوف يعلمك كيفية استخدام STL ؟ بالتأكيد لا.أكثر فائدة النهج قد تكون الاستفادة من الطاقة الهائلة من ستاكوفيرفلوو في التعلم الخاصة بلبنان الطريق الصحيح.:)

نصائح أخرى

العيب: ولكن لا أحد سوف تستخدم.

ميزة: في عملية تنفيذ ذلك سوف تتعلم لماذا المكتبة القياسية هو شيء جيد.

المزايا:تناول الطعام الخاصة بك dogfood.يمكنك الحصول على بالضبط ما كنت تفعل.

العيوب:تناول الطعام الخاصة بك dogfood.العديد من الناس أكثر ذكاء من 99% منا قد قضى سنوات في إنشاء المحكمة الخاصة بلبنان.

أنا اقترح أنك تعلم لماذا:

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

أولا

العيب:كنت قد تنفق المزيد من الوقت في التصحيح الخاص بك مكتبة فئة من حل مهما جامعة مهمة في أمامك.

ميزة:أنت من المحتمل أن تتعلم الكثير!

هناك شيء يمكنك القيام به حيال خفي مترجم الخاصة بلبنان رسائل الخطأ.STLFilt سوف تساعد في تبسيط لهم.من STLFilt الموقع:

STLFilt يبسط و/أو تنسيقه مهزار C++ الأخطاء و التحذير الرسائل مع التركيز على المحكمة الخاصة بلبنان ذات الصلة التشخيص (و MSVC 6, كاملا يلغي C4786 تحذيرات بهم المخلفات).والنتيجة يجعل العديد من حتى الأكثر خفي التشخيص مفهومة.

نظرة هنا و إذا كنت تستخدم VisualC أيضا هنا.

أعتقد أن عليك أن تفعل ذلك.

أنا متأكد من أني سوف تحصل على flambayed هذا ولكنك تعرف كل مبرمج C++ هنا في حالة سكر الكثير من المحكمة coolaid.

المحكمة الخاصة بلبنان هي مكتبة كبيرة ، ولكن أنا أعرف من أول تجربة مباشرة أنه إذا كنت لفة الخاص بك, يمكنك:

1) جعله أسرع من المحكمة الخاصة حالات الاستخدام.2) عليك كتابة المكتبة مع الواجهات التي تحتاج إليها.3) عليك أن تكون قادرا على تمديد جميع الاشياء القياسية.(لا أستطيع أن أقول لك كم تمنيت std::string عنده طريقة ())...

كل من هو على حق عندما يقولون أنه سوف يكون هناك الكثير من العمل.هذا صحيح.

ولكن سوف تتعلم الكثير.حتى لو بعد الكتابة ، كنت أعود إلى المحكمة الخاصة بلبنان وعدم استخدامه مرة أخرى, سوف لا تزال لديها تعلمت الكثير.

العيب :IMHO ، reimplimenting اختبارها وثبت المكتبات rabit الحفرة التي تكاد أن تكون جارانتيد المزيد من المتاعب أكثر مما يستحق.

قليلا من تجربتي :ليس ذلك منذ فترة طويلة لقد نفذت بلدي ناقلات مثل فئة لأنني في حاجة سيطرة جيدة على ذلك.

وأنا بحاجة genericity صنعت قالب مجموعة.

أردت أيضا أن تكرار من خلال ذلك عدم استخدام المشغل[] ولكن تزايد مؤشر مثل ستفعل مع C, حتى لا نحسب عنوان T[i] في كل التكرار...لقد تم إضافة طريقتين واحدة إلى عودة المؤشر إلى الذاكرة المخصصة آخر أن عودة المؤشر الى النهاية.تكرار خلال مجموعة من صحيح كان علي أن أكتب شيئا من هذا القبيل :

for(int * p = array.pData(); p != array.pEnd(); ++p){
  cout<<*p<<endl; 
}

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

عندها فقط لاحظت أن كنت قد كتبت غير مجدية تماما استنساخ من الأمراض المنقولة جنسيا::ناقلات<>.

على الأقل أعرف الآن لماذا يمكنني استخدام المحكمة...

آخر العيب:

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

العيب:

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

كنت قد تكون مهتمة في EASTL, كتابة المحكمة الخاصة بلبنان الفنون الإلكترونية الموثقة في حين يعود.تصميم تلك القرارات كانت مدفوعة رغبات محددة/يحتاج في المتعدد فيديو البرمجة.المجرد في ربط المادة يلخص الامر بشكل جيد.

العيب :أنت جامعة الحال ربما وضعت مثل هذا لسبب ما.حقيقة أن كنت غضب ما يكفي من ذلك (السخرية لا يقصد), قد تشير إلى أنك لا تحصل على paridigm و سوف تستفيد كثيرا عندما يكون لديك نقلة نوعية.

ميزة

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

لماذا لا نلقي نظرة على القائمة C++ المكتبات.عندما C++ لم تكن ناضجة, الناس غالبا ما كتب مكتبات خاصة بهم.إلقاء نظرة على سيمبيان (فظيعة جدا على الرغم من), Qt و WxWidgets (إذا أسعفتني الذاكرة) الأساسية مجموعات الأشياء و ربما يكون هناك العديد من الآخرين.

رأيي هو أن تعقد المحكمة الخاصة بلبنان مستمد من تعقيد C++ لغة و هناك الكثير يمكنك القيام به لتحسين المحكمة الخاصة بلبنان (وبصرف النظر عن استخدام أكثر عقلانية اصطلاح).أوصي ببساطة التبديل إلى بعض اللغات الأخرى إذا كنت تستطيع ، أو مجرد التعامل معها.

وعلى سبيل المثال ، استخدام المحكمة الخاصة بلبنان يبصق رزمة غير مفهومة و المهترئ أخطاء برنامج التحويل البرمجي

والسبب في هذا هو أساسا C++ قوالب.إذا كنت تستخدم قوالب (المحكمة الخاصة بلبنان لا) سوف تحصل على reams غير مفهومة رسائل الخطأ.حتى إذا قمت بتطبيق القالب الخاص بك على أساس جمع الصفوف لن يكون في أي مكان.

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

العيب:reimplementing كل من ذلك حسنا (التي هي على مستوى عال من الجودة) بالتأكيد سوف تأخذ عدد كبير من المطورين بضع سنوات.

ما هي المخاطر المحتملة العيوب و المزايا المحتملة إلى "المتداول بلدي" معظم الوظائف الموجودة في C++?

يمكنك أن تحمل تبرر مقدار الجهد/الوقت/المال أمضى وراء إعادة اختراع العجلة ؟

إعادة استخدام زيادة أو مشابهة.

الغريب أنه لا يمكنك استخدام دفعة.IIRC, قطع المساهمة تأتي من شخص تتصل/العامل في الجامعات (اعتقد Jakko Jarvi).الإيجابيات من استخدام دفعة هي كثيرة جدا الى قائمة هنا.

على عدم إعادة اختراع العجلة'

العيب: حين تتعلم الكثير ، يمكنك أيضا تعيين نفسك مرة أخرى, عندما تأتي إلى التفكير في ما بك الحقيقي أهداف المشروع هي.

ميزة: صيانة أسهل على الناس الذين سوف يرثون هذا.

المحكمة الخاصة بلبنان هي معقدة جدا لأنه يحتاج إلى أن يكون لغرض عام المكتبة.

الأسباب الخاصة بلبنان هي الطريقة:

  • على أساس interators حتى القياسية خوارزميات تحتاج فقط واحد لتنفيذ أنواع مختلفة من الحاويات.
  • تهدف إلى التصرف بشكل صحيح في مواجهة استثناءات.
  • تهدف إلى أن 'الموضوع' آمنة في متعدد الخيوط التطبيقات.

في الكثير من التطبيقات لكن هل حقا يكفي التالية:

  • سلسلة الدرجة
  • جدول تجزئة ل س(1), كيف
  • ناقلات/مجموعة مع نوع / الثنائية البحث عن فرز مجموعات

إذا كنت تعرف أن:

  • الفصول الدراسية لا رمي الاستثناءات على البناء أو التنازل.
  • التعليمات البرمجية الخاصة بك هي واحدة مترابطة.
  • عدم استخدام أكثر تعقيدا المحكمة الخوارزميات.

ثم ربما يمكنك الكتابة الخاصة بك أسرع رمز يستخدم ذاكرة أقل وتنتج أبسط ترجمة/أخطاء وقت التشغيل.

بعض الأمثلة أسرع/أسهل دون المحكمة:

  • النسخ عند الكتابة سلسلة مع الإشارة تحسب سلسلة العازلة.(لا تفعل هذا في مجتمع متعدد الخيوط البيئة منذ كنت في حاجة إلى قفل على مرجع الوصول.)
  • استخدام جيد جدول التجزئة بدلا من std::مجموعة std::خريطة.
  • 'جافا' أسلوب التكرار التي يمكن أن تنتقل في جميع أنحاء ككائن واحد
  • نوع التكرار التي لا تحتاج إلى معرفة نوع الحاوية (أفضل وقت الترجمة فصل من التعليمات البرمجية)
  • سلسلة الدرجة مع أكثر فائدة وظائف
  • شكلي حدود التدقيق في ناقلات الحاويات.(حتى لا [] أو .ولكن في نفس الأسلوب مع ترجمة أو وقت التشغيل العلم من 'آمنة' إلى 'سريع' واسطة)
  • حاويات مصممة للعمل مع مؤشرات إلى الكائنات التي سيتم حذف المحتوى الخاص بهم.

يبدو أنك تحديث السؤال حتى الآن هناك حقا سؤالين:

  1. ماذا ينبغي أن أفعل إذا اعتقدت std::مكتبة معقد جدا بالنسبة احتياجاتي ؟

تصميم الخاصة بك في فئات داخليا استخدام ذات الصلة std::ميزات المكتبة للقيام "رفع الأثقال" بالنسبة لك.بهذه الطريقة يكون لديك أقل للحصول على خطأ و أنت لا يزال الحصول على يخترع الخاصة بك الترميز واجهة.

  1. ماذا علي أن أفعل إذا كنت تريد أن تتعلم كيف هياكل البيانات العمل ؟

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top