سؤال

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

#if CONDITION_1
        protected override void BeforeAdd(LogEntity entity)
#else
        protected override void BeforeAdd(AbstractBusinessEntity entity)
#endif
        {
#if CONDITON_1
            entity.DateTimeInsert = DateTime.Now;
#else
            ((LogEntity) entity).DateTimeInsert = DateTime.Now;
#endif
            base.BeforeAdd(entity);
        }

using توجيهات أجمل:

#if CONDITION_1
using CompanyName.Configuration;
#endif

#if CONDITION_2||CONDITION_1
using CompanyName.Data;
using CompanyName.Data.SqlBuilders;
#else
using CompanyName.Legacy.Database;
using CompanyName.Legacy.Database.SQLBuilders;
using CompanyName.Legacy.Database.SQLBuilders.parameterTypes;
#endif

فكرت أن تعطي ConditionalAttribute الذهاب لكن ذلك لن ينجح في هذه الحالة

هل هناك أي طريقة يمكنني العمل طريقي للخروج من هذا المترجم التوجيه الكابوس ؟

رمز تجميع ضد .NET 3.5.

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

protected virtual void BeforeAdd(TEntity entity) {}

أو

protected virtual void BeforeAdd(AbstractBusinessEntity entity) {}

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


الختام

لقد انتهى اختيار @عوديد الجواب لأنه يجعل معظم معانيها كما نهج عام (K. I. S. S. و كل ذلك).أنا لا يمكن أن تستخدم في هذه الحالة على الرغم ؛ ما تراه هنا هو مجرد غيض من فيض.أنا لا أريد أن K. I. S. S.هذا الرمز إذا لم تدفع لي.

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

المحلول

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

في الحالة الثانية (باستخدام توجيهات) - يمكنك المستعار بعض التوجيهات وتشمل كل منهم باستخدام اسم مستعار عند الحاجة.ماذا يحدث عند كل مساحات يتم تضمين ؟ أي اسم التصادم?

نصائح أخرى

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

إذا كان لديك متضاربة وأسماء مساحات, يمكنك العمل مع استخدام كلمة (لا أحد الجمعيات).

لذلك يمكنك أن تفعل شيئا مثل

using LegacyLogEntity = Some.Fully.Qualified.Namespace.LogEntity;
using SomeOtherLogEntity = Some.Other.Fully.Qualified.Namespace.CurrentLogEntity;

// ..
LegacyLogEntity entity = new LegacyLogEntity();

أنا أيضا أعتقد أن المشكلة هي في الفئة الأساسية, ليس في هذا الفصل في حد ذاته.

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

أنا لا أعرف ما يسمى فئة, ولكن دعونا نقول أنه يسمى EntityAggregator.

public interface IEntity {
    DateTime InsertionTime { get; set; }
}

ثم في مجمع الفئة الأساسية:

protected virtual void BeforeAdd(IEntity entity)
{ // whatever
}

ثم في فرعية الخاص بك:

protected override void BeforeAdd(IEntity entity)
{
    entity.DateTime = DateTime.Now;
    base.BeforeAdd(entity);
}

الآن يمكنك التكيف مع الكائنات الأخرى أن تكون IEntity من خلال تنفيذ تلك الواجهة.

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

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

كنت عزل CONDITION_1 رمز إلى شيء من هذا القبيل:

// in file WhateverYourClassIs.condition1.cs
#if !CONDITION_1
#error this file should never be included in a build WITHOUT CONDITION_1 set
#endif

public partial class WhateverYourClassIs {
    protected override void BeforeAdd(LogEntity entity) {
        entity.DateTimeInsert = DateTime.Now;
        base.BeforeAdd(entity);
    }
}

// in file WhateverYourClassIs.NotCondition1.cs

#if CONDITION_1
#error this file should never be included in a build WITH CONDITION_1 set
#endif

public partial class WhateverYourClassIs {
    protected override void BeforeAdd(AbstractBusinessEntity entity) {
        ((LogEntity)entity).DateTimeInsert = DateTime.Now;
        base.BeforeAdd(entity);
    }
}

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

#if CONDITION_1
using MyAbstractBusinessEntity = LogEntity;
#else
using MyAbstractBusinessEntity = AbstractBusinessEntity;
#endif

// ...

protected override void BeforeAdd(MyAbstractBusinessEntity entity)
{
    // in CONDITION_1, the case is a no-op
    ((LogEntity)entity).DateTimeInsert = DateTime.Now;
    base.BeforeAdd(entity);
}

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

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

أنا لا أعرف إذا كان هذا هو عملي, ولكن ما أود القيام به هو إنشاء فروع في DVCS, الزئبقي, للتعامل مع هذا.

لكنت 2 فروع في اللعب ، 3rd مؤقتا بينما أنا إصلاح الخلل/إضافة التعليمات البرمجية الشائعة.

هنا هو كيف يمكنني إنشاء الإصدارات الأولية:

              5---6---7         <-- type 1 of library
             /
1---2---3---4
             \
              8---9--10         <-- type 2 of library

لإصلاح الخلل في واحد منها:

              5---6---7--11     <-- bugfix or change only to type 1
             /
1---2---3---4
             \
              8---9--10

لإصلاح الأخطاء الشائعة:

              5---6---7--11--13--15    <-- merged into type 1
             /                   /
1---2---3---4--11--12---+-------+      <-- common fix(es)
             \           \
              8---9--10--14            <-- merged into type 2

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

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