قوي جدًا مثل chrome c++ ومحمول - نصائح - مساعدة - تعليقات [مغلق]

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

سؤال

نحن ننتج كودًا محمولًا (win+macOs) ونبحث في كيفية جعل الكود أكثر قوة لأنه يتعطل بين الحين والآخر...(عادةً ما يكون هناك تجاوزات أو عمليات تهيئة سيئة): :-(

كنت أقرأ أن Google Chrome يستخدم عملية لكل علامة تبويب، لذا إذا حدث خطأ ما، فلن يتعطل البرنامج بالكامل، بل يتعطل فقط علامة التبويب هذه.أعتقد أن هذا أنيق جدًا، لذلك قد أجربه!

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

في نفس الموضوع كنت أتساءل أيضًا عما إذا كانت هناك مكتبة محمولة للعمليات (مثل التعزيز)؟

حسنا شكرا جزيلا.

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

المحلول

لقد قمت بتطوير العديد من تطبيقات C++ متعددة المنصات (أكبرها 1.5 مليون سطر من التعليمات البرمجية وتعمل على 7 منصات - AIX وHP-UX PA-RISC وHP-UX Itanium وSolaris وLinux وWindows وOS X) .لديك بالفعل مشكلتان مختلفتان تمامًا في رسالتك.

  1. عدم الاستقرار.الكود الخاص بك غير مستقر.اصلحه.

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

    • مرة أخرى، استخدم المكتبات المصممة لهذا الغرض عندما يكون ذلك ممكنًا.خاصة بالنسبة لأي بتات واجهة المستخدم الرسومية.
    • استخدم المعايير (على سبيل المثال.ANSI مقابل gcc/MSVC، وسلاسل POSIX مقابل نماذج الخيوط الخاصة بـ Unix، وما إلى ذلك) قدر الإمكان، حتى لو كان الأمر يتطلب المزيد من العمل.إن تقليل التعليمات البرمجية الخاصة بالنظام الأساسي الخاص بك يعني عملًا إجماليًا أقل، وعددًا أقل من واجهات برمجة التطبيقات (APIs) التي يجب تعلمها.
    • عزل، عزل، عزل.تجنب #ifdefs المضمنة لمنصات مختلفة قدر الإمكان.بدلاً من ذلك، ألصق التعليمات البرمجية الخاصة بالمنصة في رأسها/مصدرها/فئتها واستخدم نظام البناء الخاص بك و#includes للحصول على الكود الصحيح.يساعد هذا في الحفاظ على التعليمات البرمجية نظيفة وقابلة للقراءة.
    • استخدم أنواع الأعداد الصحيحة C99 إذا كان ذلك ممكنًا بدلاً من "long" و"int" و"short" وما إلى ذلك - وإلا فسوف يعضك عندما تنتقل من نظام أساسي 32 بت إلى نظام 64 بت وتتغير صفقات الشراء فجأة من 4 بايت إلى 8 بايت.وإذا تمت كتابة ذلك على الشبكة/القرص/إلخ، فسوف تواجه عدم توافق بين الأنظمة الأساسية.

شخصيًا، سأعمل على تثبيت الكود أولاً (دون إضافة أي ميزات أخرى) ثم التعامل مع المشكلات عبر الأنظمة الأساسية، ولكن هذا الأمر متروك لك.لاحظ أن Visual Studio يحتوي على مصحح أخطاء ممتاز (تم نقل قاعدة التعليمات البرمجية المذكورة أعلاه إلى Windows لهذا السبب فقط).

نصائح أخرى

تتعلق إجابة Chrome أكثر بتخفيف الفشل وليس بجودة التعليمات البرمجية.إن القيام بما يفعله Chrome هو الاعتراف بالهزيمة.

  1. ضمان الجودة الأفضل هو أكثر من مجرد مبرمج يختبر عمله.
  2. وحدة التجارب
  3. اختبار الانحدار
  4. اقرأ أفضل الممارسات التي تستخدمها الشركات الأخرى.

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

أنت لا تذكر ما هو المشروع المستهدف؛إن وجود عملية لكل علامة تبويب لا يعني بالضرورة وجود تعليمات برمجية أكثر "قوة" على الإطلاق.يجب أن تهدف إلى كتابة تعليمات برمجية قوية مع اختبارات بغض النظر عن قابلية النقل - فقط اقرأ عن كتابة تعليمات برمجية جيدة لـ C++ :)

أما بالنسبة لقسم قابلية النقل، فتأكد من إجراء الاختبار على كلا النظامين الأساسيين من اليوم الأول وتأكد من عدم كتابة أي تعليمات برمجية جديدة حتى يتم حل المشكلات الخاصة بالنظام الأساسي.

أنت حقًا لا تريد أن تفعل ما يفعله Chrome، فهو يتطلب مدير عمليات وهو على الأرجح مبالغة في ما تريد.

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

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

سكوت مايرز فعالة C ++ و أكثر فعالية C++ جيدة جدًا، وممتعة للقراءة.

ستيف ماكونيل اكتمال الكود هو المفضل للكثيرين، بما في ذلك جيف أتوود.

من المحتمل أن تكون مكتبات Boost خيارًا ممتازًا.أحد المشاريع التي أعمل فيها يستخدمها.لقد استخدمت خيوط WIN32 بنفسي فقط.

وأنا أتفق مع تورلاك.

التهيئة السيئة أو التجاوزات هي علامات على جودة التعليمات البرمجية الرديئة.

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

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

يجب عليك إضافة اختبارات داخلية أيضًا.تجنب النمط:

doSomethingBad(T * t)
{
   if(t == NULL) return ;

   // do the processing.
}

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

بدلاً من ذلك، على نظام التشغيل Windows (يجب أن تكون هناك واجهة برمجة تطبيقات مماثلة على نظام التشغيل MacOS)

doSomethingBad(T * t)
{
   if(t == NULL) ::DebugBreak() ; // it will call the debugger

   // do the processing.
}

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

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

إلخ..

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

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

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

بالإضافة إلى كتابة تعليمات برمجية أكثر استقرارًا، إليك فكرة واحدة تجيب على سؤالك.

سواء كنت تستخدم العمليات أو المواضيع.يمكنك كتابة برنامج مراقبة صغير / بسيط.ثم تقوم برامجك الأخرى بالتسجيل مع تلك الوكالة الرقابية.إذا ماتت أي عملية، أو مات خيط ما، فيمكن للمراقب إعادة تشغيله.بالطبع ستحتاج إلى إجراء بعض الاختبارات للتأكد من عدم الاستمرار في إعادة تشغيل نفس سلسلة الأخطاء التي تجرها الدواب.أي:أعد تشغيله 5 مرات، ثم بعد المرة الخامسة، قم بإيقاف تشغيل البرنامج بالكامل وقم بتسجيل الدخول إلى file/syslog.

أنشئ تطبيقك باستخدام رموز تصحيح الأخطاء، ثم قم بإضافة معالج استثناء أو قم بتكوين Dr Watson لإنشاء عمليات تفريغ الأعطال (قم بتشغيل drwtsn32.exe /i لتثبيته كمصحح أخطاء، بدون /i لفتح مربع حوار التكوين).عندما يتعطل تطبيقك، يمكنك فحص مكان الخطأ في Windbg أو Visual Studio من خلال رؤية مكدس الاستدعاءات والمتغيرات.

جوجل لخادم الرمز لمزيد من المعلومات.

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

أوصي بتجميع إصدار Linux وتشغيله فالجريند.

سيقوم Valgrind بتتبع تسرب الذاكرة وقراءات الذاكرة غير المهيأة والعديد من مشكلات التعليمات البرمجية الأخرى.انا اوصي بشده به.

بعد أكثر من 15 عامًا من تطوير Windows، قمت مؤخرًا بكتابة أول تطبيق C++ عبر الأنظمة الأساسية (Windows/Linux).إليك الطريقة:

  • المحكمة الخاصة بلبنان
  • يعزز.على وجه الخصوص، نظام الملفات ومكتبات المواضيع.
  • واجهة مستخدم تعتمد على المتصفح.يقوم التطبيق "باستخدام" HTTP، مع واجهة مستخدم تتكون من XHTML/CSS/JavaScript (نمط Ajax).يتم تضمين هذه الموارد في رمز الخادم ويتم تقديمها للمتصفح عند الحاجة.
  • اختبار الوحدة غزير.ليس TDD تمامًا، ولكنه قريب.هذا في الواقع غيّر الطريقة التي أتطور بها.

لقد استخدمت NetBeans C++ لبناء Linux وحصلت على منفذ Linux كامل في وقت قصير جدًا.

قم ببنائها مع فكرة أن الطريقة الوحيدة للانسحاب هي أن يتعطل البرنامج وأنه يمكن أن يتعطل في أي وقت.عند إنشائه بهذه الطريقة، لن يؤدي التعطل إلى فقدان أي بيانات أبدًا/تقريبًا.قرأت مقالاً عنه قبل عام أو عامين.للأسف ليس لدي رابط لها

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

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