ما مقياس (مقاييس) الكود الذي يقنعك بأن الكود المقدم "سيء"؟[مغلق]

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

سؤال

سطور التعليمات البرمجية لكل ملف، والأساليب لكل فئة، والتعقيد الدوري، وما إلى ذلك.يقاوم المطورون معظم الحلول إن لم يكن جميعها!هناك جيدة مقال جويل عليه (لا يوجد وقت للعثور عليه الآن).

ما هو مقياس (مقاييس) الكود الذي توصي باستخدامه تلقائيا تحديد "كود تافه"؟

ما الذي يمكن أن يقنع أكثر (لا يمكنك إقناعنا جميعًا ببعض المقاييس السيئة!):O)) ) من المطورين أن هذا الرمز "هراء".

فقط المقاييس التي يمكن قياسها تلقائيًا هي التي يتم احتسابها!

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

المحلول

لا توجد مقاييس تتعلق بأسلوب الترميز تشكل جزءًا من هذا التحذير.

بالنسبة لي يتعلق الأمر التحليل الثابت للكود, ، والتي يمكن حقًا أن تكون "مفعّلة" طوال الوقت:

أود أن أضع اختبار التغطية في خطوة ثانية، لأن مثل هذه الاختبارات قد تستغرق وقتًا.


لا تنس أن التعليمات البرمجية "الرديئة" لا يتم اكتشافها بواسطة المقاييس، ولكن بواسطة مزيج و تطور (كما في "اتجاه) من المقاييس:انظر ما هو سحر مقاييس الكود؟ سؤال.

وهذا يعني أنه ليس عليك فقط أن توصي بمقاييس الكود "لتحديد "الكود السيئ" تلقائيًا"، ولكن عليك أيضًا أن توصي بالتركيبة الصحيحة وتحليل الاتجاه لمواكبة هذه المقاييس.


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

نصائح أخرى

ليس حلاً آليًا، لكني أجد WTF في الدقيقة مفيدًا.

WTF's Per Minute
(مصدر: osnews.com)

عدد التحذيرات التي يطلقها المترجم عندما أقوم بالإنشاء.

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

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

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

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

خلاصة القول، الإنسان يتفوق على الآلة.

عدد المتغيرات العالمية

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

  • الألفاظ النابية في التعليقات.

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

هناك الكثير من المقاييس لبرنامج OO.يمكن أن يكون بعضها مفيدًا جدًا:

  • متوسط ​​حجم الطريقة (سواء في LOC/البيانات أو التعقيد).يمكن أن تكون الأساليب الكبيرة علامة على التصميم السيئ.
  • عدد الأساليب التي تم تجاوزها بواسطة فئة فرعية.يشير عدد كبير إلى تصميم فئة سيئة.
  • مؤشر التخصص (عدد الطرق التي تم تجاوزها * مستوى التداخل / إجمالي عدد الطرق).تشير الأرقام الكبيرة إلى مشاكل محتملة في مخطط الفصل.

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

  • المتغيرات العالمية
  • أرقام سحرية
  • نسبة الكود/التعليق
  • الاقتران الثقيل (على سبيل المثال، في لغة C++، يمكنك قياس ذلك من خلال النظر في العلاقات الطبقية أو عدد ملفات cpp/header التي تتضمن بعضها البعض
  • const_cast أو أنواع أخرى من الإرسال داخل نفس قاعدة التعليمات البرمجية (وليس مع libs الخارجية)
  • تم التعليق على أجزاء كبيرة من التعليمات البرمجية وتركها هناك

علامة التحذير الشخصية المفضلة لدي:تعليق كود مجاني.عادةً ما يعني ذلك أن المبرمج لم يتوقف عن التفكير في الأمر؛بالإضافة إلى أنه يجعل من الصعب فهمه تلقائيًا، مما يزيد من النسبة السيئة.

لأول وهلة:تطبيق عبادة البضائع من التعابير رمز.

بمجرد إلقاء نظرة فاحصة:الأخطاء الواضحة والمفاهيم الخاطئة من قبل المبرمج.

رهاني:مزيج من التعقيد الدوري (CC) وتغطية الكود من الاختبارات الآلية (TC).

CC | TC

 2 | 0%  - good anyway, cyclomatic complexity too small

10 | 70% - good

10 | 50% - could be better

10 | 20% - bad

20 | 85% - good

20 | 70% - could be better

20 | 50% - bad

...

crap4j - الأداة الممكنة (لجافا) وشرح المفهوم ...بحثًا عن أداة صديقة لـ C# :(

عدد التعليقات التي لا قيمة لها إلى التعليقات ذات المعنى:

'Set i to 1'
Dim i as Integer = 1

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

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

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

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

   object num = GetABoxedInt();
//   long myLong = (long) num;   // throws exception
   long myLong = Int64.Parse(num.ToString());

عندما كان ما أرادوه حقًا هو:

   long myLong = (long)(int)num;

أنا مندهش أنه لم يذكر أحد crap4j.

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

في بعض الأحيان، تعرف ذلك فقط عندما تراه.على سبيل المثال، رأيت هذا الصباح:

void mdLicense::SetWindows(bool Option) {
  _windows = (Option ? true: false);
}

كان علي فقط أن أسأل نفسي "لماذا يفعل أي شخص هذا؟".

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

نسبة التعليقات التي تتضمن ألفاظًا نابية إلى التعليقات التي لا تتضمن ذلك.

أعلى = رمز أفضل.

أسطر التعليقات / أسطر التعليمات البرمجية

value > 1 -> bad (too many comments)

value < 0.1 -> bad (not enough comments)

اضبط القيم الرقمية وفقًا لتجربتك الخاصة ;-)

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

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

طرق مع 30 وسيطة.على خدمة ويب.هذا كل شيء.

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

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

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

    2. توثيق:يمكن أيضًا أن يُعزى الكود الذي لا يحتوي على مستند كافٍ إلى انخفاض جودة البرنامج من منظور سهولة استخدام الكود.

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

هذا بلوق فرحان على مقياس الكود C.R.A.P يمكن أن يكون مفيدا.

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