Частная / вложенная функция Matlab в ООП - PullRequest
0 голосов
/ 08 июня 2018

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

function out = f1(obj, in)
   out = f2(obj, f3(in * obj.Thickness));
end

function out = f2(obj, in)
   out = f3(in / obj.NumLayers);
end

function out = f3(in)
   out = in;
end

С файлом f1.m внутри папки @MyClass.

Я решил поместить все эти файлы в класс и удалить эту папку @MyClass во время создания окончательного пакета (сейчас я на этом этапе).

На данный момент структура класса

classdef MyClass < handle
properties
   prop1
end
methods
   function obj = MyClass(varargin) ...
   function out = f1(obj, in)
end
methods (Access = private)
   function out = f2(obj, in)
end
methods (Access = private, Static)
   functions out = f3(obj, in)
end
end

Все находится в MyClass.m, f2 и f3 являются частными, но, очевидно, видны для других функций внутри класса.Я нахожу это несколько проблематичным, так как некоторые функции имеют слегка похожие имена (потому что они имеют сходные, хотя и не одинаковые вещи) и могут ввести в заблуждение любого, кто поддерживает код - включая меня позже.

Вложенные функции - это еще один вариант, который я краткорассматривается, но там мне действительно не нравится бит «общих параметров» (который является точкой этих вложенных функций) для моего варианта использования, потому что для меня это звучит склонно к ошибкам.

Я пропускаю какие-либолучшее решение здесь, или я должен придерживаться текущей вещи частных функций?

1 Ответ

0 голосов
/ 08 июня 2018

Одно из следующих решений:

classdef name

   properties
      ...
   end

   methods

      function out = f1(obj, in)
         out = f2(obj, f3(in * obj.Thickness));
      end

   end
end

function out = f2(obj, in)
   out = f3(in / obj.NumLayers);
end

function out = f3(in)
   out = in;
end

Это делает их закрытыми для класса, но не членами-методами.Я не уверен, что эти частные функции могут получить доступ к закрытым членам класса.

Альтернативой является создание закрытых функций-членов :

classdef name

   properties
      ...
   end

   methods

      function out = f1(obj, in)
         out = f2(obj, f3(in * obj.Thickness));
      end

   end

   methods (Access=private, Hidden=true)

      function out = f2(obj, in)
         out = f3(in / obj.NumLayers);
      end

      function out = f3(in)
         out = in;
      end

   end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...