سؤال

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

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

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

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

المحلول

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

نصائح أخرى

طرح هذا السؤال عن وظائف

"إذا كانت هذه الصغيرة شرط التغييرات سوف تضطر إلى تغيير كل الوظائف من أجل تلبية ذلك؟"

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

وسط حالة استخدام ماكرو إذا كان لديك المتاحة.

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

Re قص الماضي مقبول من أي وقت مضى:

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

إعادة الأجزاء التي تبدو مثل ولكن ليس بالضبط على حد سواء:

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

على سبيل المثال, إذا كان لديك مقطع التعليمات البرمجية التي تختلف في جزأين - diff#1 diff#2.و في مهرجان دبي السينمائي الدولي#1, يمكن أن يكون diff1A ، أو diff1B ، diff#2 هل يمكن أن يكون diff2A و diff2B.

إذا diff1A & diff2A دائما معا ، diff1B & diff2B دائما معا ، ثم diff1A & diff2A يمكن الواردة في أمر واحد أو فئة واحدة مجردة قالب التنفيذ ، diff1B & diff2B في آخر.

ومع ذلك ، إذا كان هناك عدة الجمع ( أيdiff1A & diff2A, diff1A & diff2B, diff1B & diff2A, diff1B & diff2B ), ثم قد تحتاج إلى إعادة التفكير في وظيفة الخاص بك لأنه قد تحاول التعامل مع الكثير من المسؤوليات من تلقاء نفسها.

إعادة البيانات SQL:

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

على سبيل المثال:

private static final String EMPLOYEE_COLUMNS = " id, fName, lName, status";

private static final String EMPLOYEE_TABLE = " employee";

private static final String EMPLOYEE_HAS_ACTIVE_STATUS = " employee";

private static final String GET_EMPLOYEE_BY_STATUS =
  " select" + EMPLOYEE_COLUMNS + " from" + EMPLOYEE_TABLE + " where" + EMPLOYEE_HAS_ACTIVE_STATUS;

private static final String GET_EMPLOYEE_BY_SOMETHING_ELSE =
  " select" + EMPLOYEE_COLUMNS + " from" + EMPLOYEE_TABLE + " where" + SOMETHING_ELSE;

في شركتي رمز قاعدة لدينا سلسلة من حوالي 10 أو كبيرة جدا شعر البيانات SQL أن يكون على درجة عالية من القواسم المشتركة.جميع البيانات الأساسية المشتركة ، أو على الأقل الأساسية التي يختلف فقط كلمة أو كلمتين.ثم هل يمكن أن المجموعة 10 البيانات إلى 3 أو 4 من المجموعات التي تضيف المشتركة الزوائد الأساسية ، ربما واحد أو اثنين من الكلمات المختلفة في كل من أطرافهم.على أية حال, أعتقد من 10 عبارات SQL كما في مجموعات فين مع تداخل كبير.

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

رمز ذكي في أن أيا من SQL من أي وقت مضى المتكررة.إذا كنت من أي وقت مضى بحاجة إلى تعديل بند في SQL, تعديله في مكان واحد فقط و كل 10 عبارات SQL التي يتم تعديلها وفقا لذلك.

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

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

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

كما مارتن فاولر يوحي ،

تفعل ذلك مرة واحدة, لا بأس.

القيام بذلك مرتين ، يبدأ رائحة.

فعل ذلك ثلاث مرات, وقت ريفاكتور.


تحرير:ردا على التعليق ، وأصل النصيحة لا روبرتس:

ثلاث ضربات و ريفاكتور.

مارتن فاولر يصف ذلك في إعادة بيع ديون الفصل 2 القسم سيادة من ثلاثة (صفحة 58).

تماما NEEEVER..

:)

يمكنك إضافة رمز في السؤال أرى أنه أسهل من ما يبدو

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

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

function add($title, $content, $edit = false)
{
    # ...
    $sql = edit ? "UPDATE ..." : "INSERT ...";
    mysql_unbuffered_query($sql);
}

عمل رائع لكن هناك أوقات أخرى عندما نسخ/لصق ضروري.لا تستخدم غريبة ومعقدة الطريق لمنع ذلك.

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

يجب عليك نسخ و لصق ؟ من يهتم!ما هو مهم هو لماذا انت نسخ ولصق.أنا لا أحاول الفلسفية على أي شخص هنا, ولكن دعونا نفكر في هذا عمليا:

هو من الكسل ؟ "بلاه بلاه, لقد فعلت هذا من قبل...أنا فقط تغيير بعض أسماء المتغيرات..القيام به."

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

هل لأنك لا تفهم ؟ "اللعنة..أنا لا أفهم كيف أن تعمل ، ولكن أنا أتساءل عما إذا كان سوف يعمل في قانون بلدي.." ربما!هذا قد يوفر لك الوقت في لحظة فورا عندما كنت وشدد على أن لديك موعد في الساعة 9 صباحاوأنت تحدق أحمر العينين في الساعة حوالي الساعة 4 صباحا

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

حتى نسخ ولصق رمز ؟ بخير إذا كنت واعية من آثار ما تفعله.خلاف ذلك ؟ لا تفعل ذلك.أيضا, تأكد من أن لديك نسخة من ترخيص من أي طرف 3rd كود نسخ ولصق.يبدو الحس ، ولكن كنت سأشعر بالدهشة كيف كثير من الناس لا.

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

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

#define RETPOS(E) do { if ((E) > 0) then return; } while(0)

ولكن هذا نقلا عن ضرورة.وأنا غالبا ما تستخدم C المعالج على الرغم من أوجه القصور لأنه لا إضافة عنصر آخر إلى toolchain و لذلك لا يتطلب تغيير عملية الإنشاء أو Makefiles.

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

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

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

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