HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Недавно я переписал свой<a>первый проект</a>на TypeScript, но не закончил работу над ним. Вооружившись полученными во время выполнения второго проекта знаниями, я возвращаюсь к "Играми разума".</p>
1 <p>Недавно я переписал свой<a>первый проект</a>на TypeScript, но не закончил работу над ним. Вооружившись полученными во время выполнения второго проекта знаниями, я возвращаюсь к "Играми разума".</p>
2 <p>Работа с Node.js и модулем<a>Commander.js</a>была очень интересной, поэтому я решил: "Почему бы мне не внедрить его и в первый проект?".</p>
2 <p>Работа с Node.js и модулем<a>Commander.js</a>была очень интересной, поэтому я решил: "Почему бы мне не внедрить его и в первый проект?".</p>
3 <h2>Содержание</h2>
3 <h2>Содержание</h2>
4 <ul><li><a>Подготовка</a></li>
4 <ul><li><a>Подготовка</a></li>
5 <li><a>Используем Commander.js</a></li>
5 <li><a>Используем Commander.js</a></li>
6 <li><a>А как же пользователь?</a></li>
6 <li><a>А как же пользователь?</a></li>
7 <li><a>Command</a></li>
7 <li><a>Command</a></li>
8 <li><a>Тесты</a></li>
8 <li><a>Тесты</a></li>
9 <li><a>Конец</a></li>
9 <li><a>Конец</a></li>
10 </ul><h2>Подготовка</h2>
10 </ul><h2>Подготовка</h2>
11 <p>Unit-тесты я буду писать на TypeScript, поэтому сначала нужно подготовить среду. В частности, к jest-пакетам из второго проекта нужно будет добавить @types/jest.</p>
11 <p>Unit-тесты я буду писать на TypeScript, поэтому сначала нужно подготовить среду. В частности, к jest-пакетам из второго проекта нужно будет добавить @types/jest.</p>
12 <h2>Используем Commander.js</h2>
12 <h2>Используем Commander.js</h2>
13 <p>Выбор игры<a>был реализован</a>через вывод списка с дальнейшим запуском через switch. Но в этом случае такой подход не годится: при запуске приложения нужно будет прописывать названия игры и использовать его в качестве аргумента.</p>
13 <p>Выбор игры<a>был реализован</a>через вывод списка с дальнейшим запуском через switch. Но в этом случае такой подход не годится: при запуске приложения нужно будет прописывать названия игры и использовать его в качестве аргумента.</p>
14 <p>Немного переписал код, протестировал, все работает. Отлично!</p>
14 <p>Немного переписал код, протестировал, все работает. Отлично!</p>
15 <h2>А как же пользователь?</h2>
15 <h2>А как же пользователь?</h2>
16 <p>Хорошо, я знаю какие есть игры и как они называются, но что делать другим? Откуда пользователь узнает, что ему запускать?</p>
16 <p>Хорошо, я знаю какие есть игры и как они называются, но что делать другим? Откуда пользователь узнает, что ему запускать?</p>
17 <p>Нужен вывод списка игр, но как его реализовать? В Commander.js есть встроенная опция --help, через которую можно показывать список. Но это неверный путь, он не логичен. Help должен выводить список опций и информацию о приложении, а не список игр. Что ж, открываю мануал.</p>
17 <p>Нужен вывод списка игр, но как его реализовать? В Commander.js есть встроенная опция --help, через которую можно показывать список. Но это неверный путь, он не логичен. Help должен выводить список опций и информацию о приложении, а не список игр. Что ж, открываю мануал.</p>
18 <h2>Command</h2>
18 <h2>Command</h2>
19 <p>Идеальный вариант, простой и логичный, внедряю. Теперь список игр выводится простой командой brain-games list. Довольно лаконично. А так выглядит вывод команды brain-games -h:</p>
19 <p>Идеальный вариант, простой и логичный, внедряю. Теперь список игр выводится простой командой brain-games list. Довольно лаконично. А так выглядит вывод команды brain-games -h:</p>
20 <p>Usage: brain-games [options] [command] A set of CLI arithmetic games Options: -v, --version output the current version -h, --help read more information Commands: list list of games with description</p>
20 <p>Usage: brain-games [options] [command] A set of CLI arithmetic games Options: -v, --version output the current version -h, --help read more information Commands: list list of games with description</p>
21 <h3>Конец?</h3>
21 <h3>Конец?</h3>
22 <p>Проект оказался слишком простым, поэтому я решил усложнить задачу и сделать работу с папкой games автоматической. Программа сама будет брать названия игр и использовать их.</p>
22 <p>Проект оказался слишком простым, поэтому я решил усложнить задачу и сделать работу с папкой games автоматической. Программа сама будет брать названия игр и использовать их.</p>
23 <p>Для этого я использую следующие модули:</p>
23 <p>Для этого я использую следующие модули:</p>
24 <p>import { readdirSync } from "fs"; import { resolve, extname } from "path"; import { cwd } from "process";</p>
24 <p>import { readdirSync } from "fs"; import { resolve, extname } from "path"; import { cwd } from "process";</p>
25 <p>Используя readdirSync, я получаю массив с названиями файлов в папке games для дальнейшей работы с ними. После этого я создал объект и интерфейс к нему для вывода списка игр с их описаниями.</p>
25 <p>Используя readdirSync, я получаю массив с названиями файлов в папке games для дальнейшей работы с ними. После этого я создал объект и интерфейс к нему для вывода списка игр с их описаниями.</p>
26 <p>Вот что у меня получилось:</p>
26 <p>Вот что у меня получилось:</p>
27 <p>$ brain-games list calc: Arithmetic expressions that need to be calculated even: Determining an even number gcd: Determining the greatest common divisor prime: Definition of a prime number progression: Finding missing numbers in a sequence of numbers</p>
27 <p>$ brain-games list calc: Arithmetic expressions that need to be calculated even: Determining an even number gcd: Determining the greatest common divisor prime: Definition of a prime number progression: Finding missing numbers in a sequence of numbers</p>
28 <h2>Тесты</h2>
28 <h2>Тесты</h2>
29 <p>Для тестирования списка игр я решил использовать openSync и rmSync из fs. Во время теста создается файл и проверятся вывод списка игр, после файл удаляется.</p>
29 <p>Для тестирования списка игр я решил использовать openSync и rmSync из fs. Во время теста создается файл и проверятся вывод списка игр, после файл удаляется.</p>
30 <p>Увы, мне удалось покрыть тестами только 59% кода. Довольно сложно тестировать то, что ничего не возвращает 😅.</p>
30 <p>Увы, мне удалось покрыть тестами только 59% кода. Довольно сложно тестировать то, что ничего не возвращает 😅.</p>
31 <h2>Конец</h2>
31 <h2>Конец</h2>
32 <p>На этом все. Теперь можно оставить первый проект в покое - добавлять в него уже нечего. Как обычно, прикрепляю ссылку на проект для самых любопытствующих.<a>Мой проект</a>.</p>
32 <p>На этом все. Теперь можно оставить первый проект в покое - добавлять в него уже нечего. Как обычно, прикрепляю ссылку на проект для самых любопытствующих.<a>Мой проект</a>.</p>
33 <p>Всем спасибо за внимание! 😊</p>
33 <p>Всем спасибо за внимание! 😊</p>
34 <p><em>P.S. А что если сделать Web-версию?</em></p>
34 <p><em>P.S. А что если сделать Web-версию?</em></p>