Лучший способ организовать классы MATLAB?

MATLAB имеет два способа организации классов:

@ -каталоги:

@ClassName\
    ClassName.m
    Method1.m
    Method2.m

Отдельные файлы:

ClassName.m:
classdef ClassName
    methods
        % all methods included here
    end
end

Первый стиль существовал до нового синтаксиса classdef, но кажется более структурированным способом работы. Второй стиль (все в одном файле) новый.

Какой метод вы используете и почему?


person jjkparker    schedule 26.03.2010    source источник


Ответы (4)


Новый однофайловый стиль имеет ряд преимуществ. Это позволяет и поощряет вас писать множество небольших методов, которые, как мне кажется, приводят к более продуманному коду. Проблемы с созданием нового файла, его сохранением и добавлением в систему управления версиями (мы все используем систему управления версиями, верно?) Незначительны, но добавление нескольких десятков небольших методов достаточно, чтобы это обычно отговаривает меня от разделения класса на более мелкие части функциональности. А редактирование всего вашего класса удобно для просмотра, поиска и замены, и вам не нужно открывать дюжину отдельных вкладок редактора, которые затем можно использовать для организации исходного кода для разных классов.

Для больших кодовых баз может быть преимущество в производительности по сравнению с однофайловым стилем. Системы управления версиями и развертывания, которые перебирают дерево исходных текстов, имеют стоимость файла для таких вещей, как операции 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

Я обнаружил, что @-directories - это кладж (например, публичный / частный, что это?), О котором лучше всего забыть. В наиболее распространенных версиях (я считаю, с 2007b) лучший способ организовать занятия - использовать пакеты. Это дает гораздо более чистое пространство имен. Я думаю, что работа со всем классом в одном файле значительно упрощает понимание того, что делает класс, и на 1000% меньше раздражает, когда дело доходит до рефакторинга (представьте, что вы изменили 8 файлов после изменения имени переменной).

person Nicholas Palko    schedule 27.03.2010
comment
Надеюсь, для рефакторинга вы можете использовать sed или perl -pi -e, а если вы используете Git, переименовать foo с bar для тысячи файлов очень просто: git ls-files | xargs perl -pi -e s/foo/bar/g. Вы на винде? Нет проблем, просто установите Cygwin или MinGW. Полагаю, что ваш последний аргумент неверен. - person nowox; 07.10.2015

Я использую однофайловый метод. Мне кажется, что проще организовать код, если он состоит из одного файла, а заголовки ячеек позволяют легко переключаться между методами. Кроме того, если я создам новый @ -класс, мне может потребоваться воссоздать путь, прежде чем я смогу его использовать, а у меня нет на это терпения.

Сказав все это, я не думаю, что однофайловый стиль намного лучше, чем многофайловый стиль; наличие большого количества небольших файлов, удобных для просмотра, также может быть очень полезным.

person Jonas    schedule 27.03.2010

Преимущество использования каталога @ClassName заключается в том, что Matlab заставляет вас очищать и перезагружать класс, если вы вносите какие-либо изменения в файл classdef. Если вы поместите реализацию функций в отдельные файлы m и просто поместите сигнатуры методов в файл classdef, вы можете возиться с реализацией, не очищая класс.

person Marc    schedule 02.04.2010
comment
Вы вынуждены перезагружать файл класса только в том случае, если вы добавляете / удаляете свойства или методы, или если вы меняете сигнатуры методов. Если вы измените что-то внутри метода, Matlab выдает предупреждение, но по-прежнему использует обновленную версию файла. Таким образом, помимо предупреждения, нет никакой разницы, когда дело доходит до очистки классов. - person Jonas; 02.04.2010