Birden fazla türde ("işler") olabilir kişiler / çalışanlar için nesne modeli

3 Cevap php

Diyelim ki işkolik bir işgücü modelleme ediyorum diyelim. Biz bir tesisatçı ve ticaret ile bir marangoz hem Bob var. Bir öğretmen, Jane var. Ve son olarak Jack, dedektif, bowling yolu girişimci, ve deli bilim adamı.

Her pozisyon ya da iş türü özelliklerini ya da yalnızca bu iş için özel yöntemler olabilir. Örneğin, bir tesisatçı bir öğretmen olmayacağını exposedButtCrack gibi fixLeakingSink gibi yöntemler () ve özelliklere sahip olacak. Ancak, bazı ortak özellikleri ve yöntemleri olacaktır.

Benim üst sınıf bir İşçi, ve birden çok devralma kaçınarak ediyorsam, böyle bir senaryoyu modellemek için en iyi uygulama yolu nedir? Ben aslında Dekoratör tasarım deseni kullanarak kabul, ama bu onun için doğru bir uygulama olduğundan emin değilim. (Bu uygulamaya ne olacağını bilerek dil yararlı olduğu, ya da açıklama kod parçacıkları eklemek istiyorsanız, bu PHP5 bulunuyor.)

3 Cevap

Herhalde kompozisyon kullanımı ve İş bir koleksiyona sahiptir İşçi olurdu. Her iş ortak bir arayüz olabilir, ama aynı zamanda kendi yöntemleri içerebilir. Eğer bu tek arabirim uygulanmasını inşa ettiği ortak bir arayüz varsayar olarak Dekoratör gerçekten burada geçerli değildir. Bileşimini kullanarak çeşitli olası İşler herhangi bir sayı için esneklik ile ortak bir İşçi sağlayacak.

C # uygulaması:

public interface IWorker
{
    void AddJob( Job job );
    void RemoveJob( Job job );
    void SetCurrentJob( Job job );
    Job GetCurrentJob();
}

public interface IJob
{
    void Work();
}

public class Worker : IWorker
{
    private List<Job> Jobs { get; set; }

    private int CurrentJob { get; set; }

    public Worker()
    {
        this.Jobs = new List<Job>();
        this.CurrentJob = -1;
    }

    public void AddJob( Job job )
    {
       this.Jobs.Add( job );
    }
    public void RemoveJob( Job job ) { ... }
    public void SetCurrentJob( Job job ) { ... }
    public Job GetCurrentJob()
    {
        return this.CurrentJob > 0 ? this.Jobs[this.CurrentJob] : null;
    }
}

public class Bartender : IJob
{
    public Work()
    {
        this.OpenBar();
        this.TendBar();
        this.Close();
        this.CleanUp();
    }

    public void OpenBar() { ... }
    public void TendBar() { ... }
    public void Close() { ... }
    public void CleanUp() { ... }
}

Oldukça düz ileri görünüyor.

Her iş türü Worker uzanır

İşçi (referanslar) iş örneklerini bir koleksiyon içerir.

(Eğer bir sorun için daha fazla bilgi eklemek istediğiniz sürece) iş hiçbir şeye miras ilişkisi vardır.

Ben Martin Fowler tarafından birkaç makaleleri okurdu: Dealing with Roles ve Accountability, ve sonra karar verin.