1

Подскажите, где я ошибаюсь. Есть задача - написать программу-симулятор включения и выключения ПК. Симуляция этих операций будет приближена к реальности, но не доподлинно. В комментариях подсказали использовать шаблон поведения"Состояние". Вот, что у меня получилось. Структура проекта

структура проекта

Реализация Computer

internal class Computer
    {
        public IPCState State { get; set; }
    public Computer() { }

    public Computer(IPCState state) => State = state;

    public bool TurnOn() => State.TurnON(this);

    public bool TurnOff() => State.TurnOff(this);
}

Интерфейс IPCState

    internal interface IPCState
    {
        bool TurnON(Computer computer);
    bool TurnOff(Computer computer);
}

Пример реализации одно из классов-загрузчиков

internal class LoaderOfTheSecondLevel : IPCState
    {
        // Передача управления исполняемому коду, записанному в PBS (Partition Boot Sector - загрузочный сектор активного раздела)
        internal bool IsPBSActive { get; private set; }
    public LoaderOfTheSecondLevel() { }

    public LoaderOfTheSecondLevel(bool state) => IsPBSActive = state;

    public bool TurnOff(Computer computer)
    {
        throw new NotImplementedException();
    }

    public bool TurnON(Computer computer)
    {
        if (IsPBSActive)
        {
            computer.State = new LoaderOfTheThirdLevel();
            return true;
        }
        else
        {
            return false;
        }
    }
}

Уверен, что делаю что-то не так, потому что как видно из кода выше, я делаю зачем-то computer.State = new LoaderOfTheThirdLevel();, но потом нигде не использую. Делаю потому, что в примере на метаните было что-то похожее.

Ну и Main

List<bool> operationRes = new List<bool>();
        PowerSocket.SetElectricityState(true);
        Computer computer = new Computer(new SystemStartup());
        operationRes.Add(computer.TurnOn());
        computer = new Computer(new LoaderOfTheFirstLevel());
        operationRes.Add(computer.TurnOn());
        computer = new Computer(new LoaderOfTheSecondLevel(operationRes.Last()));
        operationRes.Add(computer.TurnOn());
        computer = new Computer(new LoaderOfTheThirdLevel(operationRes.Last()));
        operationRes.Add(computer.TurnOn());
        computer = new Computer(new BootLoaderOSKernel(operationRes.Last()));
        operationRes.Add(computer.TurnOn());

        if (operationRes.All(r =&gt; r))
        {
            Console.WriteLine(&quot;OS is ready to work&quot;);
        }
        else
        {
            Console.WriteLine(&quot;Error&quot;);
        }

        Console.ReadLine();
    }

Расскажите, что делаю не так.

A K
  • 28,718
Facade
  • 373
  • 1
    Как только вы сказали "включение" и "выключение" вы должны были сказать слово "состояние" и подумать о паттерне состояние и стейт машинах. Язык программирования не указан, пусть будут плюсы и шарп: http://rsdn.org/article/alg/Static_Finite_State_Machine.xml и https://metanit.com/sharp/patterns/3.6.php – A K Jul 03 '20 at 11:03
  • @AK, сначала я примерно понял как его реализовать, а потом вспомнил о том, что моя модель вкл будет делать следующее(очень обобщенно): есть несколько этапов загрузки пк, на каждом из этапов участвуют отдельные компоненты, которые в случае успешного завершения своих процессов будет передавать управление на следующие этапы следующим компонентам. Можете немного объяснить, как бы в реализовывали такую модель, используя шаблон "состояние"? – Facade Jul 03 '20 at 11:26
  • И? Чистой воды стейт машина. "Есть несколько этапов загрузки ПК" -- рисуете граф состояний, прописываете откуда какие переходы нужны, потом какие действия выполнять. Возможно, вы не понимаете устройство стейт-машин? Меня вот это смущает: "отдельные компоненты, которые в случае успешного завершения своих процессов будет передавать управление на следующие этапы следующим компонентам". Вы почему-то мыслите дело так, будто стейт машина запускает компонент и потом компонент управляет запуском других компонентов. Нет же! Переходом по состояниям управляет сама машина, она сама запускает компоненты. – A K Jul 03 '20 at 12:56
  • @AK позвольте еще вопрос. Вроде я его реализовал, но меня смущает такой момент: в конечном итоге я буду запускать каждый из компонентов от лица машины? То есть, запустил первый компонент загрузки, если он вернул true, от машины запускаю второй компонент и т.д? – Facade Jul 03 '20 at 18:43
  • Судя по всему вы решили на c# писать. И на вопросе нет метки языка c#, так что почти никто из участников его не смотрел, а вы гадаете почему. Ну-ну. Кстати, статья именно по шарпу в помощь: https://habr.com/post/160105/ – A K Jul 04 '20 at 12:44
  • @AK спасибо за редактирование метки, читал статью еще вчера. Честно говоря, не получает корректно это реализовать. – Facade Jul 04 '20 at 13:11
  • 1
    Показали как это правильно будет для моего случая вот здесь – Facade Jul 05 '20 at 23:18

0 Answers0