Новый однофайловый стиль имеет ряд преимуществ. Это позволяет и поощряет вас писать множество небольших методов, которые, как мне кажется, приводят к более продуманному коду. Проблемы с созданием нового файла, его сохранением и добавлением в систему управления версиями (мы все используем систему управления версиями, верно?) Незначительны, но добавление нескольких десятков небольших методов достаточно, чтобы это обычно отговаривает меня от разделения класса на более мелкие части функциональности. А редактирование всего вашего класса удобно для просмотра, поиска и замены, и вам не нужно открывать дюжину отдельных вкладок редактора, которые затем можно использовать для организации исходного кода для разных классов.
Для больших кодовых баз может быть преимущество в производительности по сравнению с однофайловым стилем. Системы управления версиями и развертывания, которые перебирают дерево исходных текстов, имеют стоимость файла для таких вещей, как операции stat и diff. Для большей кодовой базы, скажем, тысячи методов, это может иметь значение, особенно на сетевом диске. Я подозреваю, что есть также влияние на производительность приложений, развернутых с помощью компилятора Matlab. Время запуска увеличивается с размером развернутой кодовой базы. Часть этой стоимости зависит от файловых операций и потому, что файлы (я думаю) зашифрованы индивидуально. Я подозреваю, но не тестировал экспериментально, что использование определений классов одного файла снизит стоимость запуска для скомпилированных приложений Matlab.
Однако для большей части кода я использую старую многофайловую организацию. Отчасти потому, что наша кодовая база была создана за несколько лет до того, как новый стиль стал общедоступным. Но отчасти ради производительности. Новая организация одного файла работает только с классами Matlab MCOS нового стиля, и они медленнее, чем классы Matlab старого стиля, из-за более высоких накладных расходов на отправку методов. Например. вот фрагмент теста, показывающий время выполнения ничего не делающих методов nop ().
Calling each function/method 100000 times
nop() function: 0.02715 sec 0.27 usec per call
nop(obj) method: 0.24629 sec 2.46 usec per call
classdef nop(obj): 0.98572 sec 9.86 usec per call
classdef obj.nop(): 1.81307 sec 18.13 usec per call
В кодовой базе, которая делает много вызовов методов, это может существенно повлиять на производительность. (См. Также MATLAB OOP медленно или я что-то не так делаю?)
Еще одна проблема заключается в том, что автоиндентор Matlab будет отступать от каждого раздела и каждого метода в определении класса, поэтому базовый уровень всего вашего исполняемого кода составляет две табуляции, тратя впустую 8 столбцов экрана.
В целом, если бы не соображения производительности OO, я бы, вероятно, выбрал один файл, и таким образом я пишу новые классы, не критичные для производительности.
ОБНОВЛЕНИЕ: Также похоже, что contentsrpt (), полезный генератор документации, не работает с функциями, определенными внутри файла classdef; только те, что находятся в отдельных файлах функций.
person
Andrew Janke
schedule
29.03.2010