Nome per l'utilizzo di metodi che restituiscono anziché impostare

1

Esiste un principio OOP generale secondo cui i metodi dovrebbero restituire variabili locali piuttosto che impostare campi oggetto.

Ad esempio, supponiamo di avere la seguente parte di codice (esempio in Java):

public class Number {
    public int myNum;
}

public class Horrible {
    public static void areYouSerious(Number num){
        num.myNum = 47;
    }
}

public class Test {
    public int num = new Number();

    public void doHorribleThings(){
        Horrible.areYouSerious(num);
    }

    public static void main(String[] args){
        Test test = new Test();
        test.doHorribleThings();
    }
}

Ovviamente questo stile di programmazione può andare di traverso molto rapidamente e diventa un enorme mal di testa per chiunque tenti di mantenerlo. Un modo più corretto per farlo sarebbe il seguente:

public class Number {
    public int myNum;
}

public class NotAsBad {
    public static int getDefaultVal(){
        return 47;
    }
}

public class Test {
    public int num = new Number();

    public void doHorribleThings(){
        num.myNum = NotAsBad.getDefaultVal();
    }

    public static void main(String[] args){
        Test test = new Test();
        test.doHorribleThings();
    }
}

Il primo esempio sta modificando un riferimento passato, mentre il secondo sta generalizzando la funzione di impostazione statica, facendogli restituire un valore che può essere usato per impostare il campo dell'oggetto.

Esiste un nome per il principio secondo cui il secondo metodo dovrebbe essere preferito al primo? Una sorta di principio di "modularità"?

Proprio come encapsulation è il termine per limitare la manipolazione delle variabili, vorrei un termine per limitare l'ambito degli effetti di alcune funzionalità.

Se non c'è un termine esistente, lo chiamerò localizzazione delle conseguenze .

    
posta MirroredFate 27.03.2014 - 00:36
fonte

2 risposte

1

Che ne dici invece?

public class Number
{
    private int startingValue;

    public Number(int value)
    {
        startingValue = Value;
    }
}

public static class EvenBetter
{
    public static int GetDefaultValue()
    {
        return 47;
    }
}

public static void Main(String[] args)
{
    int number = new Number(EvenBetter.GetDefaultValue());
}

Puoi chiarire ulteriormente inserendo il metodo statico GetDefaultValue () nella classe Number e quindi istanzialo in tal modo:

int number = new Number(Number.GetDefaultValue());

o somesuch.

Il motivo per cui il tuo primo esempio è "cattivo" è che si tratta fondamentalmente di un "generatore di effetti collaterali". Quello che stai cercando di ottenere (eventualmente) è Programmazione funzionale con immutabilità . Lo fai scrivendo le funzioni che accettano alcuni input e restituiscono alcuni output senza modificare l'input originale o provocando altri effetti collaterali.

Ad esempio: Funzioni mappa non sono male (anche se sembrano produrre effetti collaterali ), perché restituisci sempre una nuova raccolta, invece di modificare la raccolta sul posto.

    
risposta data 27.03.2014 - 00:47
fonte
0

method args should be pass by value or passed as immutable object references

Questo è ciò che ho letto in alcuni materiali di riferimento sotto argomenti di "incapsulamento". per esempio; java.lang.String. non ho trovato nessun altro termine per questo però.

    
risposta data 27.03.2014 - 01:19
fonte

Leggi altre domande sui tag