WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Import von Package-Funktionen

 

Nicolas S.
Forum-Century

Forum-Century


Beiträge: 146
Anmeldedatum: 15.07.09
Wohnort: ---
Version: R2014a/b
     Beitrag Verfasst am: 11.11.2018, 11:16     Titel: Import von Package-Funktionen
  Antworten mit Zitat      
Hallo zusammen,

ich bin nach etlichen Jahren Matlab-Abstinenz wieder an einem größeren Ein-Mann-Projekt. Ziel ist eine Toolbox für die Auswertung von Meßdaten. Die Matlab-Version ist R2014a/R2014b, da hier für alle Meßrechner noch Lizenzen vorhanden sind.

Da sehr viele, sehr kleine Funktionen entstehen, habe ich das Ganze in ein paar Klassen und Packages aufgeteilt. Also so:
Code:

+myToolbox/+measurement/@class1
+myToolbox/+measurement/@class2
+myToolbox/@hlpfcn1
+myToolbox/@hlpfcn2
+myToolbox/@plotfun
+myToolbox/@cellfcn
...
 

Sprich: Alles wird in einem gemeinsamen Haupt-Package landen.

In den Skripten, die "myToolbox" benutzen, kann ich mit
Code:

import('myToolbox.*')
 

alle Funktionen sehr komfortabel nutzen. Meine Frage bezieht sich also auf die Funktionen/Klassen innerhalb dieser Toolbox, bei denen ellenlange Aufrufe stehen. Will ich diese langen Aufrufe zugunsten der Lesbarkeit verkürzen, weiß ich mir im Moment nur mit function handles zu helfen, wie z.B. hier bei dieser statischen Methode, die zwei andere statische Methoden derselben Klasse aufruft:
Code:

function [ h, varargin ] = popHandle( varargin )
%PLOTFCN.POPHANDLE Pop figure or axis handle, if it is the first arguement
% return value is cell array
% will throw error if handle is invalid/deleted
%
% Usage:
%   [ h, varargin ] = plotPopFigureHandle( varargin )
% 23.10.2018 Nicolas
%
% {$HeadURL:  $}
% {$Date:  $}
% {$Revision:  $}
% {$LastChangedBy:  $}


isfigure = @emgToolbox.plotfun.isfigure;
isaxes = @emgToolbox.plotfun.isaxes;

if ~isempty(varargin) && isfigure(varargin{1}) || isaxes(varargin{1})  
    h = varargin{1};
    if( ~isgraphics(h) )
        error('Plot refers to deleted handle')
    end
    varargin = varargin(2:end);
else
    h = [];
    varargin = varargin(:);
end


end

 


Gibt es die Möglichkeit, auch auf Klassenebene imports oder einen ähnlichen Mechanismus zu nutzen?

Im Bereich der Unit-Tests scheint dies in Bezug auf Fixtures möglich zu sein - wie sieht es bei "normalen" Klassen aus?

Viele Grüße
Nicolas
_________________

--
The programmer suggested it.
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.11.2018, 11:48     Titel:
  Antworten mit Zitat      
Hallo,

versuch mal
Code:
import('emgToolbox.plotfun.*')


Das muss aber wohl in jeder einzelnen Methode stehen.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Nicolas S.
Themenstarter

Forum-Century

Forum-Century


Beiträge: 146
Anmeldedatum: 15.07.09
Wohnort: ---
Version: R2014a/b
     Beitrag Verfasst am: 11.11.2018, 12:07     Titel:
  Antworten mit Zitat      
Hallo Harald,

das war auch mein erster Versuch, allerdings ist mir unklar, ob und wie ich die Funktionen im Namensraum nutzen kann:
Code:

function [ h, varargin ] = popHandle( varargin )
%PLOTFCN.popHandle
% Klasse wurde in der Zwischenzeit umbenannt, da Name so besser zu den anderen passt

switch( 3 )
    case 0
        % Der alte Weg - funktioniert
        isfigure = @emgToolbox.plotfcn.isfigure;
        isaxes = @emgToolbox.plotfcn.isaxes;
    case 1
        % Sind "isfigure" und "isaxes" jetzt Teil des Namespaces?
        import('emgToolbox.plotfcn.*');
        % -> Undefined function or variable "isfigure".
    case 2
        % Ist nur die Toolbox Teil des Namespaces?
        import('emgToolbox.plotfcn.*');
        isfigure = @plotfcn.isfigure;
        isaxes = @plotfcn.isaxes;
        % -> Undefined function 'plotfcn.isfigure' for input arguments of
        % type 'double'.
    case 3
        % Funktioniert die alte Adressierung noch?
        import('emgToolbox.plotfcn.*');
        isfigure = @emgToolbox.plotfcn.isfigure;
        isaxes = @emgToolbox.plotfcn.isaxes;
end

if ~isempty(varargin) && isfigure(varargin{1}) || isaxes(varargin{1})  
    h = varargin{1};
    if( ~isgraphics(h) )
        error('Plot refers to deleted handle')
    end
    varargin = varargin(2:end);
else
    h = [];
    varargin = varargin(:);
end


end

 

Ich bastel nach dem Mittagessen mal ein lauffähiges Minimalbeispiel. Nicht, dass meine jetzigen Sachen geheim sind- sie sind nur ein peinliches Durcheinander.
_________________

--
The programmer suggested it.
Private Nachricht senden Benutzer-Profile anzeigen
 
Nicolas S.
Themenstarter

Forum-Century

Forum-Century


Beiträge: 146
Anmeldedatum: 15.07.09
Wohnort: ---
Version: R2014a/b
     Beitrag Verfasst am: 11.11.2018, 13:20     Titel:
  Antworten mit Zitat      
Ahja, ich habe herausgefunden: Der Import per Wildcard scheint in den Methoden nicht zu funktionieren. Aber es geht der Import einer Klasse:

Code:

switch( 5 )
    case 0
        % Der alte Weg - funktioniert
        isfigure = @emgToolbox.plotfcn.isfigure;
        isaxes = @emgToolbox.plotfcn.isaxes;
    case 1
        % Sind "isfigure" und "isaxes" jetzt Teil des Namespaces?
        import('emgToolbox.plotfcn.*');
        % -> Undefined function or variable "isfigure".
    case 2
        % Ist nur die Toolbox Teil des Namespaces?
        import('emgToolbox.plotfcn.*');
        isfigure = @plotfcn.isfigure;
        isaxes = @plotfcn.isaxes;
        %-> Undefined function 'plotfcn.isfigure' for input arguments of
        %type 'double'.
    case 3
        % Funktioniert die alte Adressierung noch?
        import('emgToolbox.plotfcn.*');
        isfigure = @emgToolbox.plotfcn.isfigure;
        isaxes = @emgToolbox.plotfcn.isaxes;
        % -> Immerhin
    case 4
        % Import ohne Wildcards ?
        import('emgToolbox.plotfcn.isfigure');
        import('emgToolbox.plotfcn.isaxes');
        % -> Undefined function or variable "isfigure".
    case 5
        % Import der Klasse ohne Wildcards ?
        import('emgToolbox.plotfcn');
        import('emgToolbox.plotfcn');
        isfigure = @plotfcn.isfigure;
        isaxes = @plotfcn.isaxes;
        % -> Juchhu!
end
 

Damit kann ich erst einmal leben.

Allerdings bevorzuge ich ja Wissen gegenüber Ausprobieren.

Leider scheint das tolle Dokument "Objekct Oriented Programming in Matlab" (R2012) für die Release 2014x nicht mehr verfügbar. Die Sachen sind irgendwie in die MATLAB® Programming Fundamentals gewandert. Dort finde ich allerdings nicht, warum ich in Skripten Importe per Wildcard machen kann, in Methoden nicht.

Kennt noch jemand eine gute Beschreibung dazu?

Viele Grüße
Nicolas
_________________

--
The programmer suggested it.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.11.2018, 14:31     Titel:
  Antworten mit Zitat      
Hallo,

ist isfigure eine statische Methode der Klasse plotfcn? Dann muss der Aufruf immer über den Klassennamen plotfcn erfolgen, und du kannst nur das Package importieren, in dem die Klasse ist.
Ich würde erwarten, dass import('emgToolbox.*'); ausreicht, um isfigure = @plotfcn.isfigure; funktionieren zu lassen.

Folgende Doku-Seite und die darin verlinkten Themen könnten helfen:
https://de.mathworks.com/help/matlab/ref/import.html

Zitat:
Allerdings bevorzuge ich ja Wissen gegenüber Ausprobieren.

Meine pragmatische Sichtweise dazu: wenn ich es ausprobiert habe, dann weiß ich's :)

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Nicolas S.
Themenstarter

Forum-Century

Forum-Century


Beiträge: 146
Anmeldedatum: 15.07.09
Wohnort: ---
Version: R2014a/b
     Beitrag Verfasst am: 11.11.2018, 15:35     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:

ist isfigure eine statische Methode der Klasse plotfcn? Dann muss der Aufruf immer über den Klassennamen plotfcn erfolgen, und du kannst nur das Package importieren, in dem die Klasse ist.
Ich würde erwarten, dass import('emgToolbox.*'); ausreicht, um isfigure = @plotfcn.isfigure; funktionieren zu lassen.


Stimmt: So geht es auch. Das ist sogar noch einmal ein Stück angenehmer:
Code:

switch( 6 )
    case 0
        % Der alte Weg - funktioniert
        isfigure = @emgToolbox.plotfcn.isfigure;
        isaxes = @emgToolbox.plotfcn.isaxes;
    case 1
        % Sind "isfigure" und "isaxes" jetzt Teil des Namespaces?
        import('emgToolbox.plotfcn.*');
        % -> Undefined function or variable "isfigure".
    case 2
        % Ist nur die Toolbox Teil des Namespaces?
        import('emgToolbox.plotfcn.*');
        isfigure = @plotfcn.isfigure;
        isaxes = @plotfcn.isaxes;
        %-> Undefined function 'plotfcn.isfigure' for input arguments of
        %type 'double'.
    case 3
        % Funktioniert die alte Adressierung noch?
        import('emgToolbox.plotfcn.*');
        isfigure = @emgToolbox.plotfcn.isfigure;
        isaxes = @emgToolbox.plotfcn.isaxes;
        % -> Immerhin
    case 4
        % Import ohne Wildcards ?
        import('emgToolbox.plotfcn.isfigure');
        import('emgToolbox.plotfcn.isaxes');
        % -> Undefined function or variable "isfigure".
    case 5
        % Import der Klasse ohne Wildcards ?
        import('emgToolbox.plotfcn');
        isfigure = @plotfcn.isfigure;
        isaxes = @plotfcn.isaxes;
        % -> Juchhu!
    case 6
        % Import des Packages mit Wildcards ?
        import('emgToolbox.*');
        isfigure = @plotfcn.isfigure;
        isaxes = @plotfcn.isaxes;
        % -> Juchhu!
end
 


Harald hat Folgendes geschrieben:

Zitat:
Allerdings bevorzuge ich ja Wissen gegenüber Ausprobieren.

Meine pragmatische Sichtweise dazu: wenn ich es ausprobiert habe, dann weiß ich's :)


"Hand crafted test driven design". Klingt deutlich besser als "Trial and error".

Naja, die Web-Version bietet kaum einen Vorteil gegenüber "doc import". Mit Beschreibung meine ich ein Whitepaper oder so. Ich habe auch kein Problem damit, einige Euro in ein Buch zu investieren. "How the MATLAB designers expected you to organize classes, packages and toolboxes - a compact guide on 300 pages". Oder so. :-)
_________________

--
The programmer suggested it.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.