m0nya

На Пикабу
Дата рождения: 14 августа 1983
поставил 1 плюс и 3 минуса
100 рейтинг 0 подписчиков 23 подписки 1 пост 0 в горячем

Ответ Vanek239 в «Я написал свою книгу по программированию»

Подержите мое пиво.

Итак, есть програмка. Хочется сделать ее более красивой.

Код как в изначальном примере, я тут только добавил реакцию на попытку открытия двери.

Ответ Vanek239 в «Я написал свою книгу по программированию» Программирование, IT, Айтишники, Программист, Csharp, Текст, Ответ на пост, Длиннопост

Файл Program.cs

Поехали.

  1. Выделяем интерфейс для внешнего ввода IInput. Реализация внешнего ввода через консоль.

Ответ Vanek239 в «Я написал свою книгу по программированию» Программирование, IT, Айтишники, Программист, Csharp, Текст, Ответ на пост, Длиннопост

Файл ConsoleInput.cs

2. Выделяем интерфейс для внешнего вывода IOutput. Реализация вывода также через консоль.

Ответ Vanek239 в «Я написал свою книгу по программированию» Программирование, IT, Айтишники, Программист, Csharp, Текст, Ответ на пост, Длиннопост

Файл ConsoleOutput.cs

3. Выделяем класс "Door". Класс зависит от внешних ввода и вывода. Т.е. от интерфейсов IInput, IOutput. Внедрение зависимостей через конструктор.

По сравнению с оригиналом, логика здесь чуть-чуть была причесана.

Ответ Vanek239 в «Я написал свою книгу по программированию» Программирование, IT, Айтишники, Программист, Csharp, Текст, Ответ на пост, Длиннопост

Файл Door.cs

4. Делаем Program красивым. Program работает с IOutput и Door. Зависимости также задаются через конструктор.

В методе Main инициализируем все сущности, добавляем вызов метода Run у Program.

Ответ Vanek239 в «Я написал свою книгу по программированию» Программирование, IT, Айтишники, Программист, Csharp, Текст, Ответ на пост, Длиннопост

Измененный файл Program.cs

Итог.

"Ну и нафига все это надо?" - спросит читатель. - "Столько писанины лишней!".

Не спорю. Но дело в том что теперь:

1. Способы ввода и вывода можно менять, просто добавляя новые реализации (классы) для интерфейсов IInput и IOutput. Например, можно сделать чтение и вывод через файлы, просто создав соответствующие новые классы для этих интерфейсов и проинициализировав их в Program.cs

2. Функционал из IInput и IOutput можно использовать в других частях программы, если такие будут.

3. Наконец, можно покрыть основной код unit тестами.

Бонус.

Пример unit тестов (xUnit).

Используется Moq для подмены реализаций IInput и IOutput.

Классы Program и Door используются "настоящие" и именно их содержимое будет протестировано.

Ответ Vanek239 в «Я написал свою книгу по программированию» Программирование, IT, Айтишники, Программист, Csharp, Текст, Ответ на пост, Длиннопост

Начало файла ProgramTests.cs

Здесь изображен конструктор для тестов. Он автоматически создает Program с зависимостями перед запуском каждого теста.

Проверяем, что у нас будет на выходе IOutput, если на IInput будут определенные воздействия.

1. Тесты. Если возраст менее или равен 18.

Ответ Vanek239 в «Я написал свою книгу по программированию» Программирование, IT, Айтишники, Программист, Csharp, Текст, Ответ на пост, Длиннопост

Файл ProgramTests.cs. Часть 2

2. Тесты. Если возраст более 18.

Ответ Vanek239 в «Я написал свою книгу по программированию» Программирование, IT, Айтишники, Программист, Csharp, Текст, Ответ на пост, Длиннопост

Файл ProgramTests.cs. Часть 3

Прохождение тестов:

Ответ Vanek239 в «Я написал свою книгу по программированию» Программирование, IT, Айтишники, Программист, Csharp, Текст, Ответ на пост, Длиннопост

В принципе, здесь можно еще тестов понаписать. Например, непокрытым остался private метод EnterAge, у класса Door (обработка ошибок парсинга ввода).

Вот такой рефакторинг получился.

Исходники тут (надеюсь, что будут доступны): https://filetransfer.io/data-package/c9BtU9lp#link

Показать полностью 9
Отличная работа, все прочитано!