ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
19 мая
339214 Топик полностью
bialix (06.07.2012 18:12, просмотров: 339) ответил fk0 на Не надо гнаться за "читаемыми" программами. Надо разделить проектирование и программирование. Программа после этого должна быть не читаемой, а верифицируемой, что она соответствует документации, где есть схема конечного автомата, например. Вот
Я не могу с вами согласиться. Программы пишутся для людей, чтобы их читали. Хорошие программы пишутся не по принципу: написал и забыл, а их приходится дорабатывать, улучшать, добавлять новые функции. Нечитаемые программы превращают дальнейшую работу с ними в ад. Я знаю. Если над кодом работает больше одного человека -- это опять ад. Если у каждого из них свои понятия о программе -- это ад. Давайте поговорим про верифицируемость. Как вы верифицируете программы? Насколько я помню проблема полной формальной верификации программы на соответствие требованиям или документации или схеме конечного автомата - не решена до сих пор. Кроме тех случаев, когда сам код для автомата сгенерирован автоматические из диаграммы состояний автомата. Тогда да: автоматиски сгенерированный код обычно читать не возможно и никто его не читает. Используется исходное представление автомата в виде диаграммы состояний и переходов, а сгенерированный си-код -- это продукт компиляции, аналогичный объектным файлам или файлам листинга. (хотя листинги я читаю, но нечасто). Либо у вас есть какая-то сложная формальная система для генерации кода из диаграмм и верификации, либо ваши слова -- это просто описание идеальной ситуации к которой (мне тоже) хотелось бы стремиться, но приходится жить с тем что есть. Или поговорим про автоматические тесты. Даже лучше про автоматические тесты. Писать тесты для автоматов - это геморрой. Я пробовал. Я знаю. Это больно. И чем больше состояний у автомата, тем больнее. Автоматы -- это плохо для тестов, потому что у них есть состояние. Изменение этого состояния -- это side-effect. Это не тестируется нормально. Если состояние это глобальная переменная, то к проблеме с тестами добавляются проблемы с глобальными переменными, которые могут сохранять свои значение между запусками отдельных тестов. Если вам надо проверить поведение автомата для конкретного состояния, вам надо автомат перевести в это состояние в начале теста. Если кроме состояния автомата при работе используются еще и дополнительные данные, которые формируются по мере прохождения других состояния -- это опять геморрой. Проще всего тестировать функциональные программы. Подали на вход аргументы - получили результат. Если порезать автомат на отдельные функции -- это можно. Но это опять ад. У вас будет столько функций сколько состояний. При их числе больше чем пальцев на одной руке -- это ад. Я тестировал автоматы как черные ящики. И делал специальные бэкдоры, чтобы устанавливать автомат в нужное состояние. Это можно сделать. Но цена! Если я смогу уйти от автоматов на функции, то я смогу облегчить себе жизнь в плане тестирования. Если я хочу уйти с текущей работы на другую, то как ответственный человек я хочу, чтобы тот кто придет после меня, смог разобраться в моем коде. Лучше чтобы этот код был таки читаемым и понимаемым. Если мне достался в наследство код от уволившегося программиста, и глядя на этот код на ум приходят только нехорошие слова и еще кое-что похуже, то я предпочту все-таки читаемый код. Короче я никак не могу согласиться. Не так давно я прочитал хорошую книгу Dustin Boswell, Trevor Foucher, "The art of readable code" вот тут неплохой обзор http://demin.ws/bl …/art-of-readable-code/ Я имею основания считать, что верифицируемость программ -- это такой миф, и что в реальности все немножко не так. Поэтому читабельность кода для меня важна.