MonoState, المفرد, أو أشكال مستمدة:أفضل نهج الخام التطبيق ؟

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

سؤال

لدي إلى حد كبير الخام WinForm التطبيق يحتوي على العديد من الكائنات. الشخص, التسجيل, خطة, CaseNote الخ.هناك أكثر من 30 الأشكال التي تشكل التطبيق مع واجهة المستخدم مقسمة منطقيا. الأعضاء, الالتحاق, خطط, CaseNotes, الخ.

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

الآن لدي صفر التعرض إلى أنماط التصميم ولكن أنا أحاول.قرأت http://www.switchonthecode.com/tutorials/csharp-tutorial-singleton-pattern و http://www.yoda.arachsys.com/csharp/singleton.html ولكن أريد أن تأكد من أنني أفهم بشكل صحيح كيفية تطبيق هذا الوضع.

أول هذه الأمثلة الدولة أن يتم الوصول إلى المرجعية, صحيح ؟ هل أنا مخطئ أو سوف تحتاج إلى الوصول إلى القيمة?

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

شكرا

تحرير 1

لتوضيح جميع الكائنات الطفل الأشياء من شخص.أيضا ، مثل صفحة البحث يتملص ؛ يمكن للمستخدمين تحديد مختلف currentPerson.ولكن يمكن أن تتفاعل فقط مع واحد شخص في وقت واحد.

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

تحرير 2

استنادا إلى رجل الطب تعليق فكرت wauld توضيح.

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

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

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


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

المحلول

يمكنك استخدام نمط المفرد أن أؤكد أن حالة واحدة فقط من أي وقت مضى خلق.

ومع ذلك ، هيئة المحلفين ما زالت مستمرة (على الأقل في رأيي) على ما إذا كان هذا هو قرار جيد.هناك الكثير من القراءة في ذلك وغيرها من الأماكن عن هذا.

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

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

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

تحرير:

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

البرنامج.cs

static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MyDerivedForm(new Person { Name = "Hello World!" }));
        }
    }

الشخص.cs

public class Person
{
    public virtual string Name { get; set; }
}

PersonForm.cs

using System;
using System.Windows.Forms;

public class PersonForm : Form
{
    private readonly Person myPerson;

    protected virtual Person MyPerson 
    {
        get
        {
            return this.myPerson;
        }
    }

    private PersonForm()
    {
    }

    public PersonForm(Person person)
    {
        this.myPerson = person;
    }
}

MyDerivedForm.cs (إضافة تسمية اسمه label1)

public partial class MyDerivedForm : SingletonMadness.PersonForm
{
    public MyDerivedForm(Person person)
        : base(person)
    {
        InitializeComponent();
    }

    private void MyDerivedForm_Load(object sender, EventArgs e)
    {
        label1.Text = this.MyPerson.Name;
    }
}

نصائح أخرى

أول هذه الأمثلة الدولة أن يتم الوصول إلى المرجع الصحيح ؟ هل أنا مخطئ أم أن كنت بحاجة إلى الوصول إلى القيمة ؟

الفئة التي تحاول الوصول إليه هو إشارة إلى فئة واحدة في الذاكرة.على سبيل المثال ، يقول صفك هو:

public class Person { ... }

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

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

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

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

public static class PersonController
{
    private static Person _Person;

    public static Person GetPerson()
    {
        if (_Person == null)
            _Person = new Person();

        return _Person;
    }
}

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

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

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

public class Context
{
   private static Context _instance;

   public static Context Instance
   {
       get
       {
           if (_instance == null)
           {
               _instance = new Context();
           }
           return _instance;
       }
   }

   public Person CurrentlySelectedPerson { get; set; }

   private Context() { }
}

(لاحظ أن هذه ليست مثالية نمط المفرد لأنه ليس موضوع آمنة...)

ثم البحث في شكل مجموعة المحدد حاليا شخص مع:

Context.Instance.CurrentlySelectedPerson = personSelectedInForm;

الديمغرافية من يمكن استخدامه مثل:

//Get the demographics for the current person
ShowDemographics(Context.Instance.CurrentlySelectedPerson);

يمكنك أيضا استخدام monostate النمط الخاص بك Personفئة.

public class Person
{
    public Guid Id { get; set; }
    public String FirstName { get; set; }
    public String LastName { get; set; }
}

بناء monostate كائن Person.

public class CurrentPerson
{
    public static Person Person { get; set; }

    public Guid Id
    {
        get { return CurrentPerson.Person.Id; }
        set { CurrentPerson.Person.Id = value; }
    }

    public String FirstName
    {
        get { return CurrentPerson.Person.FirstName; }
        set { CurrentPerson.Person.FirstName = value; }
    }

    public String LastName
    {
        get { return CurrentPerson.Person.LastName; }
        set { CurrentPerson.Person.LastName = value; }
    }
}

الآن يمكنك تهيئة monostate.

CurrentPerson.Person = GetPersonByUserInput();

ومن ثم استخدام CurrentPerson الحالات في جميع أنحاء رمز وأنها الوصول مشترك مشترك الدولة.

CurrentPerson currentPerson = new CurrentPerson();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top