Не делать. Используйте StringTemplate вместо этого - нет никакой причины рассмотреть любой другой движок шаблонов, как только Вы знаете об этом.
Я попытаюсь подытожить некоторые из уже приведенных здесь пунктов, с которыми я согласен.
Лично я не думаю, что есть ответ "полегче". Существуют веские причины , почему вам не нужен служебный класс, заполненный статическими методами.
Короткий ответ заключается в том, что в объектно-ориентированном мире вы должны использовать объекты и все хорошее, что с ними связано (инкапсуляция, полиморфизм).
Если метод расчета расстояния между генами варьируется , вы должны примерно (более вероятно, Стратегия ) иметь класс гена для каждого варианта. Инкапсулируйте то, что меняется. В противном случае вы получите несколько «если».
. Это означает, что если новый метод расчета расстояния между генами появится в дальнейшем, вы не должны изменять существующий код , а скорее добавить новый . В противном случае вы рискуете сломать то, что уже есть.
В этом случае вам следует добавить новый класс Gene, а не изменять код, написанный в #geneDistance
Вы должны сообщить своим объектам что делать, а не спрашивать их состояние и принимать решения за них. Внезапно вы нарушаете принцип единственной ответственности , поскольку это полиморфизм.
Статические методы вполне могут быть легко протестированы изолированно, но в будущем вы будете использовать этот статический метод в других классы. Когда дело доходит до тестирования этих классов на изоляцию, вам будет сложно это сделать.
Проверьте параметры setvbuf ()
и _IOFBF
, _IOLBF
для этой функции.
fseek ()
или fflush ()
требует библиотеки для фиксации буферизованных операций.
Стандарт определяет операцию поиска или сброса как обязательную, чтобы позволить библиотеке использовать некоторые ярлыки; в противном случае для каждой операции ввода-вывода библиотека должна будет проверять, была ли предыдущая операция также операцией чтения (или операцией записи), и запускать сброс сама по себе, если "направление" ввода-вывода изменилось. Со спецификациями как есть, библиотека может предположить, что клиент выполнил поиск / сброс перед изменением направления ввода-вывода.
fseek ()
или fflush ()
требуют библиотеки для фиксации буферизованных операций.
Стандарт определяет операцию поиска или сброса как обязательную, чтобы позволить библиотеке использовать некоторые ярлыки; в противном случае для каждой операции ввода-вывода библиотека должна будет проверять, была ли предыдущая операция также операцией чтения (или операцией записи), и запускать сброс сама по себе, если "направление" ввода-вывода изменилось. Со спецификациями как есть, библиотека может предположить, что клиент выполнил поиск / сброс перед изменением направления ввода-вывода.
fseek ()
или fflush ()
требуют библиотеки для фиксации буферизованных операций.
Стандарт определяет операцию поиска или сброса как обязательную, чтобы позволить библиотеке использовать некоторые ярлыки; в противном случае для каждой операции ввода-вывода библиотека должна будет проверять, была ли предыдущая операция также операцией чтения (или операцией записи), и запускать сброс сама по себе, если "направление" ввода-вывода изменилось. Со спецификациями как есть, библиотека может предположить, что клиент выполнил поиск / сброс перед изменением направления ввода-вывода.
Потому что он упрощает код ОС / библиотеки. Файловый поток может иметь отдельные буферы чтения и записи , и потребуются дополнительные усилия, чтобы обеспечить их постоянную синхронизацию. Иногда это стоило бы производительности, когда в этом не было необходимости.
Поэтому вместо этого программист должен делать это явно, когда это необходимо.
Прочтите « Стандартная библиотека C » Плагера, чтобы понять, почему различные функции стандартной библиотеки (C89) такие, какие они есть, и, в частности, почему части стандартные библиотеки ввода-вывода такие, какие есть. Одна из причин заключается в том, что C работает в очень разных системах и с разными носителями; с такими устройствами, как магнитные ленты, вполне возможно, нужно обращаться иначе, чем с дисками, о которых вы привыкли думать. Кроме того, в Unix рассмотрите свое «tty» устройство - оно соединяет клавиатуру и мышь с экраном - три совершенно разных аппаратных компонента. Координация между ними достаточно сложна; правила в стандарте делают это проще.
Обратите внимание, что стандарт требует этого. Это из стандарта C11, ISO / IEC 9899: 2011, но формулировка была аналогичной в предыдущих редакциях:
§7.21.5. приведенный выше список значений аргументов режима), как ввод, так и вывод могут выполняться на связанный поток. Тем не менее, за выходом не должен следовать вход без промежуточный вызов функции
fflush
или функции позиционирования файла (fseek
,fsetpos
илиrewind
), и ввод не должен сопровождаться непосредственно выводом без промежуточный вызов функции позиционирования файла, если операция ввода не встречает конец файла. Открытие (или создание) текстового файла в режиме обновления может вместо этого открыть (или создать) двоичный поток в некоторых реализациях.