Perché categorizzazione in "Proprietà" e "Metodi"

1

Sto osservando la classe String in Actionscript 3.0.

Ha una proprietà chiamata String.length. Internamente è una funzione getter (o metodo?) Che restituisce la lunghezza della stringa.

Perché non può essere String.getLength ()?

I metodi possono contenere 1, 2 o più valori ... quindi il loro significato può essere compreso. Ma quale significato ha "proprietà"? Dopotutto, è solo una funzione. Quindi, perché la categorizzazione in proprietà? È solo per aggiungere un sovraccarico di riflessione per ricordare che qualcosa è stato classificato in una proprietà?

In altre parole, come programmatore, come sono aiutato quando ho detto che String.length è una proprietà della classe String quando non riesco a trovare alcun metodo per lo stesso.

Durante la scrittura di un programma, come potrei sapere cos'è una proprietà e quale è un metodo?

Apprezzo che qualcuno abbia fatto luce su questo.

V.

    
posta Vishwas G 02.08.2012 - 10:14
fonte

3 risposte

12

String.Length è una proprietà di sola lettura, quindi probabilmente non è il miglior punto di partenza.

Immagina di avere una classe Person che deve memorizzare un nome completo di persone.

In Java, potresti creare una coppia di metodi, setName() e getName() , per gestire questo valore. Ecco due metodi, necessari per gestire un singolo valore.

È solo la convenzione che collega insieme questi due metodi. Qualcuno che non conoscesse la convenzione - ad esempio qualcuno che si è autodidatta - potrebbe invece scrivere metodi AssignName() e Name() . Dopo tutto, è solo una convenzione.

Formalizzando la relazione in qualcosa chiamato property , C # (e altre lingue) elimina la necessità per gli sviluppatori di conoscere e rispettare la stessa convenzione di chiunque altro.

Una volta che hai la proprietà unificata, ci sono altri benefici. Ad esempio, puoi passare una proprietà come parametro out o ref se lo desideri, non puoi farlo con un paio di metodi.

Mentre guardi attraverso altri linguaggi di programmazione, ci sono altri esempi di questo approccio da trovare.

  • Un'interfaccia è "solo" una classe astratta pura .
  • Un delegato è "solo" una funzione come valore .
  • MethodMissing () e dynamic sono "solo" i modi in cui una classe consente di chiamare metodi che non esistono.
  • Un evento è "solo" il modo in cui la lingua supporta il pattern Observer.
  • Le parole chiave async e await in C # 5.0 sono "solo" un altro modo per scrivere codice asincrono.
  • I Metodi di estensione sono "solo" metodi statici .

Tranne che tutte queste cose sono più di quelle che sono "solo". Aumentano l'espressività della lingua coinvolta, consentendo migliori astrazioni e un codice più efficace.

    
risposta data 02.08.2012 - 11:39
fonte
2

Risposta breve: String.Length è una proprietà getter dell'oggetto stringa. È una proprietà di sola lettura senza un modificatore impostato in .NET Framework.

Come suggerito, dai un'occhiata a questo confronto - Discussione SO su Proprietà vs Metodi

Leggi anche dalla documentazione ufficiale di String.Length

    
risposta data 02.08.2012 - 10:24
fonte
1

La differenza deriva dal fatto che alcune lingue hanno diversi contesti di denominazione per cose diverse. Parlerò con esempi e definizioni non così precise da essere più chiaro.

Esempio 1: JavaScript - contesto di denominazione singola

    Le funzioni
  • sono chiamabili che, quando chiamate codice eseguibile, potrebbero avere effetti collaterali e un valore di ritorno
  • Gli oggetti
  • sono, beh ... tutto tranne che null e indefiniti, anche funzioni, primitive ecc.
  • tutti questi hanno nomi, quindi quando usi un nome per connettere un oggetto o una funzione a un altro oggetto diventano tutti proprietà del nuovo oggetto e il gioco è fatto.

var object = {};
// they all share the same naming context of object
object.fn = function() {}; // adding a function property which becomes a method
object.number = 1; // adding a primitive type property
object.object = {}; // adding an object property
// object.fn = 2; // will overwrite the method

Esempio 2: Java - doppio contesto di denominazione

    Le funzioni
  • sono chiamabili, eseguono codice, effetti collaterali, potrebbero restituire valore
  • Le funzioni
  • non possono esistere se non sono collegate ad un oggetto avendo un nome che diventi metodo (il metodo è una funzione che ha questo )
  • tutte le funzioni condividono lo stesso contesto di denominazione su un oggetto e possono anche avere più di una con lo stesso nome solo se hanno parametri diversi
  • qualsiasi cosa diversa dalla funzione, che è un oggetto o una primitiva, può anche essere connessa a un oggetto con un nome e condividono contesti diversi di denominazione dai metodi

In questo modo:

class JavaObject {
    public void property(){}; // function attached to an object is called method
    public void property(int){}; // multiple functions with same name allowed
    public int property;  // the same name, but in a different context, still ok
    //public long property; // this one's name wiil clash with the int property
}

Per farla breve: Alcune lingue possono avere metodi e non metodi come proprietà con lo stesso nome, quindi cerchiamo di indicare quali di questi parliamo.

    
risposta data 02.08.2012 - 10:44
fonte

Leggi altre domande sui tag