Devo affermare nei pacchetti? [duplicare]

3

Ho già letto alcune asserzioni e domande di eccezione; Però chiedo specificatamente delle classi visibili del pacchetto.

Quando scrivi un pacchetto, le classi segnate con "public" vengono esposte al mondo esterno, quindi vengono utilizzate eccezioni per consentire agli utenti dell'interfaccia del pacchetto di sapere che stanno usando il pacchetto errato.

Le classi che vengono lasciate deselezionate sono esposte solo all'interno del pacchetto, no? Quindi sono propenso a dire che quando qualcosa va storto in una classe visibile del pacchetto, le asserzioni verrebbero utilizzate per interrompere le classi che ho creato dall'invio di dati negativi.

È una cosa bella da fare?

Ho adottato l'idea che gli oggetti conservino i propri dati come privati per loro e che i metodi siano pubblici / privati come necessario per lavorare internamente o con altre classi. Una volta che la classe viene identificata come fare troppo, la classe viene suddivisa in oggetti più semplici destinati a lavorare insieme.

A questo punto esistono molte classi, ma solo alcune dovrebbero essere esposte al mondo esterno. Quindi ho raggiunto la conclusione che i pacchetti sono come oggetti super, che espongono quanto basta affinché l'intera "comunità" di classi possa lavorare insieme per risolvere il problema. In questo modo l'implementazione è nascosta ma viene comunque fornito un servizio.

Questa comprensione è corretta? Questo è ciò su cui si basa la domanda, poiché la comunità di classi è creata in modo "privato per il pacchetto", non è esposta all'esterno e, quindi, dovrebbero essere usate le asserzioni?

    
posta user2738698 11.04.2014 - 19:36
fonte

1 risposta

2

That is what the question is based on, since the community of classes is created in a "private to the package" manner, it is not exposed to the outside, and so, should assertions be used instead?

No. Anche se è vero che le asserzioni non dovrebbero far parte del tuo contratto pubblico, ciò non significa che tutti i contratti non pubblici dovrebbero essere applicati attraverso asserzioni!

Le asserzioni non sono (solo) una questione di visibilità. Sono un tipo diverso di meccanismo, utilizzato per segnalare un diverso tipo di problema.

Le asserzioni segnalano errori logici inerenti al codice. Sono checkpoint che un programmatore introduce per intercettare i bug in anticipo e attivarli significa che un programma non funziona più normalmente o in modo prevedibile. Le eccezioni riguardano errori di utilizzo e circostanze impreviste che possono sorgere durante l'esecuzione altrimenti normale di un programma.

Ecco un esempio che chiarisce questo. Fa parte di un'implementazione di java.util.Iterator :

public Object next() {
    if ( !hasNext() ) {
        // usage error: there is no next object
        throw new NoSuchElementException();
    }

    // logic error: hasNext() says okay, but there is no next element!
    assert next != null : "hasNext() but not found!";
    Object retval = next;
    next = null;
    return retval;
}

Un altro esempio che potrebbe essere in un'implementazione pubblica di java.util.Set :

public boolean add(Object o) {
    if ( o == null ) throw new IllegalArgumentException("does not accept null");

    added = // adding magic here

    // either it was added, or it was already in: either way, must contain now
    assert contains(o) : "added but does not contain?";
    return added;
}

Entrambe le affermazioni sono in metodi pubblici di classi che potrebbero essere allo stesso modo pubblici. Ma la loro presenza è fondamentalmente lì per assicurarmi, il programmatore, che le mie assunzioni / affermazioni sul codice che ho scritto siano valide. Se gli utenti del mio codice vedono AssertionErrors, significa che il mio codice ha un problema.

I seguenti sono cattivi esempi di asserzioni:

public boolean add(Object o) {
    // disabling asserts makes the code below possibly take nulls
    assert o != null : "does not accept null";
}

public Object next() {
    // this is a usage error
    assert hasNext();
}
    
risposta data 19.05.2014 - 19:35
fonte

Leggi altre domande sui tag