Пример реализации принципа сегрегации интерфейса, приведенный в книге Agile Principles для дяди Боба - PullRequest
0 голосов
/ 20 июня 2019

Верна ли моя реализация рисунка 12-1? Figure12-1

Это реализация примера "Загрязнение интерфейса" из книги дяди Боба. Шаблоны и практики гибких принципов в C #.

Я попытался реализовать его следующим образом: -

using System;

namespace AgilePrinciplesCSharp.Chapter12.Listing12_2
{
    class Listing12_2
    {
        static void Main(string[] args)
        {
            var door = new TimedDoor();
            var client = new Client(door);
            client.TimeOut();
        }
    }

    public interface ITimerClient
    {
        void TimeOut();
    }

    // We force Door, and therefore (indirectly) TimedDoor, to inherit from TimerClient.
    public interface IDoor : ITimerClient
    {
        void Lock();
        void Unlock();
        bool IsDoorOpen();
    }

    // Implementation of Door Interface with Timer functionality
    public class TimedDoor : IDoor
    {
        public bool IsDoorOpen()
        {
            return true;
        }

        public void Lock()
        {
            Console.WriteLine("Door Locked");
        }

        public void TimeOut()
        {
            var timer = new Timer();
            timer.Register(5, this);
            Console.WriteLine("Timeout! Door left open for so long");
        }

        public void Unlock()
        {
            Console.WriteLine("Door Unlocked");
        }
    }

    // Timer class can use an object of TimerClient
    public class Timer
    {
        public void Register(int timeout, ITimerClient client)
        {
            /* CODE */
        }
    }

    // Client uses Door Interface without depending upon any particular implementation of Door
    public class Client
    {
        IDoor door;

        public Client(IDoor door)
        {
            this.door = door;
        }

        public void TimeOut()
        {
            door.TimeOut();
        }
    }
}

Я сомневаюсь в том, как реализация описана в книге, где Door иногда называют классом, а иногда интерфейсом, и я запутываюсь, нужно ли мне иметь отдельную реализацию класса Door, кроме IDoor интерфейс? Также автор не использует нотацию I при именовании интерфейса, что делает его еще более запутанным.

Если кто-то прочитал книгу, я надеюсь, что сможет понять мою проблему и помочь мне с этим.

ПРИМЕЧАНИЕ. Эту книгу также можно читать онлайн. Это обсуждение на стр. 215. https://druss.co/wp-content/uploads/2013/10/Agile-Principles-Patterns-and-Practices-in-C.pdf

1 Ответ

2 голосов
/ 20 июня 2019

Я полагаю, что он использует нотацию диаграмм классов UML, поэтому эта диаграмма, кажется, применима:

enter image description here

Ссылка .

Если я правильно прочитал, TimedDoor должен наследоваться от Door.Но в вашем примере TimedDoor реализует IDoor.Это не согласуется с диаграммой.

Объявление должно быть следующим:

class TimedDoor : Door

Не думаю, что вам нужен IDoor.Что в данном примере является верным, так это то, что Door должен реализовывать ITimerClient, чтобы Timer мог выполнять над ним операции.ITimerClient должен выставлять одного публичного участника, Timeout().Предположительно, когда таймер вызывает этот метод, дверь должна сама отпереться, если это дверь по времени.Поведение по умолчанию (например, для несвоевременной двери), вероятно, бездействие.

interface ITimerClient
{
    void Timeout();
}

class Door : ITimerClient
{
    public virtual void Timeout()
    {
        //No operation; this isn't a timed door
    }

    //etc.
}

class TimedDoor : Door
{
    protected bool locked = true;

    public override void Timeout()
    {
        this.Unlock();  //Override default behavior because this type of door is timed
        base.Timeout();  //Optional, sometimes recommended
    }

    public virtual void Unlock()
    {
        this.locked = false;
    }

    //etc.
}
...