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

17
задан chappjc 20 October 2013 в 00:30
поделиться

4 ответа

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

6
ответ дан 30 November 2019 в 12:35
поделиться

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

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

В целом, если бы не соображения производительности объектно-ориентированного программирования, я бы, вероятно, выбрал один файл, и таким образом я пишу новые классы, не критичные для производительности.

ОБНОВЛЕНИЕ: Также похоже, что contentsrpt (), полезный генератор документации, не работает с функциями, определенными внутри файла classdef; только те, что находятся в отдельных файлах функций.

18
ответ дан 30 November 2019 в 12:35
поделиться

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

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

5
ответ дан 30 November 2019 в 12:35
поделиться

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

1
ответ дан 30 November 2019 в 12:35
поделиться