В matlab можно ли поместить методы классов, организованных в папки, в подкаталоги / подпапки? - PullRequest
2 голосов
/ 06 января 2020

Я новичок в опции организации ваших классов в папках классов в matlab. С точки зрения читабельности, мой код выигрывает от размещения методов класса в отдельных файлах, потому что часто методы довольно длинные. Теперь я считаю, что было бы еще лучше, если бы я мог организовать свой код дальше; Я хотел бы создать подкаталоги в папке класса. Структура, которую я ищу, выглядит следующим образом (просто пример):

@Foo/
├──Foo.m/
│
├──staticMethods/
│  ├──staticMethod1.m
│  ├──staticMethod2.m
│
├──privateMethods/
│  ├──privateMethod1.m

Однако я не могу найти ничего о вложенных папках в папках классов, и при работе это не работает, потому что matlab, похоже, не находит папки staticMethods и privateMethods.

Поэтому мой вопрос: в папках классов matlab можно создавать подпапки с методами в них?

1 Ответ

2 голосов
/ 06 января 2020

Нет, это невозможно. M-файлы ищутся только в самой директории Foo, а в подкаталогах - нет. Исключением является подкаталог с именем private, который может содержать функции M-файла, видимые только для M-файлов в его родительском каталоге ( документация ).

Publi c методы все должны быть прямо в каталоге Foo. Закрытые методы могут быть в подкаталоге private. Методы Stati c должны быть определены в файле classdef.

В общем случае ваша структура каталогов может выглядеть следующим образом:

@Foo/
├──Foo.m
├──A.m
├──B.m
├──private/
│  ├──X.m
│  ├──Y.m

Foo.m должна содержать classdef определение класса Foo (или, если вы go с классом pre-classdef, просто метод конструктора, хотя это не рекомендуется). Определение classdef содержит все методы, установщики и получатели stati c, а также все методы, которым требуются специальные разрешения доступа. Функции A и B являются опубликованными c методами Foo. X и Y - это функции, доступные для любого кода в Foo.m, A.m, B.m, X.m и Y.m.


Для структурирования вашего кода вы можете взять более длинные функции и разделить их как частные подфункции, оставив не намного больше, чем его объявление в classdef:

classdef ClassName
   properties
      ...
   end
   methods
      function obj = C(obj,vararg)
         obj = C_internal(obj,vararg{:});
      end
   end

и в файле private/C_internal.m:

function obj = C_internal(obj,arg2,arg3,arg4,...)
   ...
end

(обратите внимание на использование vararg, которое предотвращает повторение списка аргументов, дублированные списки аргументов являются хорошим способом введения ошибок.)

Единственная проблема здесь заключается в том, что документация все еще должна находиться в Foo.m. Лично мне не нравится отделять код от документации, и я предпочитаю хранить их вместе в одном файле.

...