Tutte le combinazioni di attributi Get / SetAccess, Access e Dependent property hanno casi d'uso validi?

0

Se non hai familiarità con OOP Matlab

Per coloro che non hanno familiarità con matlab, matlab fornisce una varietà di attributi di accesso durante la creazione delle variabili membro. Tutte le variabili membro sono essenzialmente proprietà C # a sé stante, chi ottiene e imposta i valori come predefiniti all'accesso normale e all'assegnazione. Qualsiasi variabile membro (e intendo qualsiasi) può avere il suo get e impostare "operatori" sovrascritti in questo modo:

%typical OOP class
classdef MyClass
    %both Properties in the C# sense *and* member variables
    %default access is public, put it here for clarity
    properties (Access = public)
        myProperty
        myMember
    end

    methods
        function self = set.myProperty(self, value)
            % doesn't invoke recursion, actually references a variable called
            % self.myProperty, which if you overwrite the get.property,
            % you can't actually access outside of set and get
            self.myProperty = ...
        end

        function value = get.myProperty(self)
            ...
        end

        %constructor, self is the class instance
        function self = MyClass(value)
            self.myMember = value;
            %actually calls set.myProperty
            self.myProperty = value;
        end
    end
end

Non puoi chiamare anche get.myProperty o set.myProperty, non è affatto nella lingua.

Se vuoi una proprietà C # reale, devi fare quanto segue, dato che a volte non puoi fare riferimento al valore reale usato all'interno delle funzioni myProperty se hai definito un valore (come puoi solo riferire all'assegnazione di quel valore all'interno di quella funzione) o get (dove chiamerebbe sempre la funzione get).

classdef MyClass
    %both Properties in the C# sense *and* member variables
    %default access is public, put it here for clarity
    properties (Access = private)
        myMember
    end
    properties (Access = public, Dependent = true)
        myProperty
    end

    methods
        function self = set.myProperty(self, value)
            % since the property is "dependent" it no longer can refer to a
            % variable called self.myProperty, it can only refer to other properties
            self.myMember = ...
        end

        function value = get.myProperty(self)
            value = self.myMember
        end
    end
end

Sfondo attributo proprietà Matlab

Ora mi interessano in particolare le seguenti combinazioni di proprietà: Access , GetAccess , SetAccess e Depedent :

Accesso che definisce se la proprietà è pubblica, privata o protetta [1]

(Access = public|private|protected)

Ottieni / Imposta proprietà (funziona come l'accesso sopra, ma con funzioni get e set) [1]

(GetAccess = public|private|protected)
(SetAccess = public|private|protected)

Dipendente (in realtà non ha un valore direttamente associato ad esso, non può assegnare il suo nome all'interno del suo get e set, appare come una proprietà C # in seguito, ma può anche essere privato e protetto)

(Dependent = true|false)

Domanda

Una proprietà con get e set definiti che non era Dependent è mai stata un caso d'uso valido? Sembra che tu stia nascondendo il valore stesso dalla classe in questo modo, stai rendendo il valore un dettaglio di implementazione alla tua classe. Per quanto riguarda le proprietà con get o set definite ma non entrambe?

La validità cambierebbe se Set/GetAccess o generale Access fosse cambiato in private , protected o public ?

Sulla stessa linea, le proprietà con% ridefinito% co_de e% co_de mai devono essere utilizzate nel codice di implementazione? Non hai idea di ciò che effettivamente fanno e ad un osservatore casuale sembrano semplicemente membri normali, quindi sembrerebbe che il loro uso sarebbe pericoloso nel codice di implementazione della classe, sembra che ciò richiederebbe anche una convenzione di denominazione separata.

[1] (Nota: può anche definire classi specifiche che hanno accesso alla proprietà che non sono correlate , la validità di questo è al di fuori dell'ambito della domanda).

    
posta opa 19.10.2017 - 21:45
fonte

1 risposta

1

Non sono un esperto di Matlab, ma mi sembra che tu abbia ragione; non tutte le possibili combinazioni di GetAccess , SetAccess , Access e Dependent saranno valide.

Ad esempio, non ha senso per me una proprietà Dependent == true (che, se ho capito bene, è una "proprietà calcolata" o "Always computed on the fly ") avrebbe mai un setter public , poiché non avrebbe mai senso consentire a un utente di impostare una proprietà che viene calcolata internamente. Anche se fosse possibile codificarlo correttamente, non ci sarebbe posto disponibile per il valore in arrivo da memorizzare.

Poiché il compilatore potrebbe non avere l'intelligenza per determinare se ciò che si sta tentando o meno è ragionevole, l'onere è sul programmatore di utilizzare combinazioni di queste parole chiave che hanno senso.

Questo è vero tanto per C # quanto per Matlab. Mentre gli sviluppatori di C # acquisiscono esperienza, arrivano a comprendere alcune combinazioni di questi modificatori come indicative di certe tecniche.

Ad esempio:

public string Name { get; private set }

viene immediatamente riconosciuto dalla maggior parte degli sviluppatori di C # come parte di una tecnica per rendere un oggetto immutabile, mentre altre combinazioni, come

public string Name { private get; private set }

sono in realtà riconosciuti dal compilatore come non validi.

    
risposta data 19.10.2017 - 23:01
fonte

Leggi altre domande sui tag