2010-03-26 6 views
17

MATLAB имеет два способа организации занятий:Лучший способ организовать классы MATLAB?

@ -directories:

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

Одиночные файлы:

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

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

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

ответ

5

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

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

6

Я нашел @-directories как kludge (например, публичный/частный, что это?), Который лучше всего забыть. В наиболее читаемых версиях (с 2007 года, я считаю), the best way to organize your classes is with packages. Это дает гораздо более чистое пространство имен. Я думаю, что работа со всем классом в одном файле упрощает восприятие того, что делает класс, и на 1000% менее раздражает, когда дело доходит до рефакторинга (представьте, что вы меняете 8 файлов после изменения имени переменной).

+0

Надеемся, что для рефакторинга вы можете использовать 'sed' или' perl -pi -e', и если вы находитесь в Git, переименовывая foo с помощью панели в тысячу файлов, это просто: 'git ls-files | xargs perl -pi -e s/foo/bar/g'. Вы в Windows? Нет проблем, просто установите Cygwin или MinGW. Я предполагаю, что ваш последний аргумент недействителен. – nowox

18

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

Для более крупных кодовых баз могут существовать преимущества производительности для однофайлового стиля. Системы контроля и развертывания источников, которые выполняют итерацию по исходному дереву, имеют стоимость каждого файла для таких вещей, как операции stat и diff. Для большей базы кода, скажем, тысяч методов, которые могут быть значительными, особенно на сетевом диске. Я подозреваю, что также есть эффект производительности для приложений, развернутых с помощью компилятора Matlab. Время запуска увеличивается с размером развернутой кодовой базы. Это часть затрат, связанных с файлами, из файловых операций и потому, что файлы (я думаю) зашифрованы индивидуально. Я подозреваю, но экспериментально не тестировал, что использование определений классов одного файла уменьшит стоимость запуска для скомпилированных приложений Matlab.

Однако для большей части моего кода я использую старую многофайльную организацию. Отчасти потому, что наша кодовая база была запущена несколько лет назад, прежде чем новый стиль был общедоступным. Но отчасти для исполнения. Новая организация с одним файлом работает только с новыми классами MCOS Matlab, и они медленнее, чем старые классы Matlab, из-за более высоких затрат на отправку метода. Например. Вот фрагмент, показывающий время выполнения методов do-nothing 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 

В кодовой базе, которая делает много вызовов методов, это может оказать значительное влияние на производительность. (Смотрите также Is MATLAB OOP slow or am I doing something wrong?)

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

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

UPDATE: Он также выглядит как полезный генератор документации, содержащийся в файле contentsrpt(), не работает с функциями, определенными внутри файла classdef; только те, которые находятся в отдельных файлах функций.

1

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

+1

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

 Смежные вопросы

  • Нет связанных вопросов^_^