Dovrei creare più oggetti in Java?

1

Sono un Java molto nuovo e ho fatto un pasticcio con un programma che essenzialmente stampa una linea casuale di caratteri basata su valori di char casuali e manipolazione dell'array.

Ho molti problemi a capire la relazione tra classe di oggetti mentre la mia unica altra esperienza di programmazione proviene da MATLAB. Pertanto, ho trattato il mio programma essenzialmente proprio come scriverei un programma MATLAB. Tutto è fatto all'interno del metodo principale e diverso dalla creazione del random () per poter utilizzare rng, non ho creato nessun altro oggetto. Semplicemente non riesco a vedere l'uso per nessuno nel mio codice. Leggere e osservare le spiegazioni sulla struttura delle classi di oggetti è utile solo in parte con me perché fondamentalmente riguardano tutti gli oggetti di un modello di auto sotto la classe del costruttore di automobili o altra metafora del mondo reale. Sebbene questo mi aiuti a visualizzare concettualmente lo scopo di un oggetto, sto avendo problemi a compartimentare il mio codice nella struttura generica di oggetti di classe in quanto in realtà non segue alcun modello gerarchico; È solo una serie di istruzioni switch e cicli / while che restituiscono un valore.

Va bene che non utilizzi nuovi oggetti nel mio codice? Forse non capisco ancora abbastanza le classi e gli oggetti. Qualcuno potrebbe provare a spiegare lo scopo di creare un oggetto diverso da quello per l'organizzazione del codice. (Ho anche creato un paio di metodi statici prima del main che invoco per tutto il programma. Sono questi nel posto giusto o dovrebbero essere inizializzati i metodi all'interno del main?)

    
posta The Yeti 12.09.2017 - 07:58
fonte

1 risposta

2

Should I be creating more objects in Java?

Se puoi creare altre classi utili dovresti. Come farai, le altre classi dovrebbero diventare più piccole.

...messing around with a program that essentially prints a random line of characters based on random char values and array manipulation.

Bene! L'esperienza è un buon insegnante. Ecco una sfida: separare il codice per stampare la linea e manipolare la matrice dal codice che decide quale sia la tua fonte di casualità. Puoi creare codice che potrebbe trarre da una diversa fonte di casualità senza che l'altro codice debba essere modificato?

I am having a lot of trouble understanding the object-class relationship

La metafora preferita per questo è case e progetti. Vivi in una casa ma hai bisogno di un progetto (piano casa) per costruire una casa. Una classe è un progetto che definisce come creare un oggetto. Le classi hanno nomi. Gli oggetti no. Hanno un indirizzo in cui esistono. Ricordiamo quell'indirizzo con un riferimento.

House blueHouse = new House("Blue");

blueHouse è un riferimento che punta all'oggetto, non alla classe utilizzata per costruirlo. Quella classe può essere usata per creare un altro oggetto:

House redHouse = new House("Red");

Stessa classe, oggetto diverso.

my only other programming experience comes from MATLAB. Therefore, I have been treating my program essentially just like I would write a MATLAB program. Everything is done within the main method

Questo è chiamato programmazione procedurale. La maggior parte delle persone prima esperienze di programmazione si concentra sulla programmazione procedurale. Comincia dall'inizio, procedi nel mezzo e quando arrivi alla fine ti fermi. Bel modello semplice. Sfortunatamente vuol dire che devi guardare ad ogni livello di dettaglio mescolato insieme.

I haven't created any other objects. I simply can't see the use for any in my code. Reading and watching explanations on the object-class structure is only helpful to an extent with me because they basically all relate objects to a car model under the class of the car manufacturer or other real-world metaphor. Although this helps me conceptually visualize the purpose of an object, I'm having trouble compartmentalizing my code into the generic class-object structure as it doesn't really follow any hierarchical pattern; It's just a series of switch statements and for/while loops that return a value.

Ugg, il temuto modello di auto. L'auto ha un motore, è un veicolo. Blech.

Iniziamo con quello che dobbiamo raggiungere. Bene, potremmo andare al negozio ma sono pigro. Quindi lascia che sia il motore:

Engine engine = new Engine();

Raffreddare è stato facile. Ora vediamo cosa dobbiamo giocare con

  • cambia olio
  • cambia il fluido di trasmissione
  • carica batteria
  • sostituire la cinghia della ventola
  • riempire il liquido del tergicristallo
  • carica gas
  • avvia il sistema di accensione
  • sterzare con cremagliera e pignone

Questo è, beh, molto. Tutto quello che voglio fare è andare al negozio. Perché sto guardando tutto questo? Perché siamo all'astrazione sbagliata. Certo, potresti schiaffeggiare questo motore su un telaio con le gomme e guidare guidando sul blocco motore, infilando un sondaggio nella cremagliera e nel pignone e legando una stringa di scarpa attorno all'acceleratore. Ma perché? Quindi puoi cambiare l'olio a 50 miglia all'ora?

DriverControls dc = new DriverControls(new Engine());
  • avvia il sistema di accensione
  • sterzare con il volante

Ora abbiamo tutto ciò che abbiamo fatto prima, è lo stesso motore, ma dobbiamo solo guardare a ciò di cui abbiamo bisogno per fare questo lavoro. Questo ci mette nella giusta astrazione.

Potresti pensare che io abbia fatto la stessa cosa che farebbe la cosa "è-un veicolo". Beh, ho e non ho. Non mi interessa se la cosa che posso iniziare e guidare è un veicolo o un videogioco. Ho una routine drive-to-the-store che ha bisogno di qualcosa da avviare e guidare. Non mi interessa cosa sia quel qualcosa.

Piuttosto che iniziare con un'idea come una macchina e capire ogni costrutto che potrebbe avere una relazione con essa, inizia con un bisogno. Aggiungi qualcosa che possa soddisfare questo bisogno.

Is it all right that I don't utilize new objects in my code? Maybe I just don't quite understand classes and objects yet. Could someone try to explain the purpose of creating an object other than just for organizing code.

L'organizzazione del codice non è cosa da poco. Ma programmare in modo orientato agli oggetti è più di questo. Ha lo scopo di farti prendere una decisione in un unico posto. Ciò significa che quando cambi idea, non devi trovare 50 luoghi in cui hai diffuso tale decisione e modificarli tutti.

Comprendi che non puoi semplicemente creare classi e un sacco di oggetti e chiamare ciò che fa orientato agli oggetti. Posso scrivere codice procedurale che utilizza tonnellate di oggetti e classi. Il solo usarli non è abbastanza. Devi usarli correttamente.

Racconta, non chiedere è l'idea che dovresti progettare le tue classi per fare ciò che sono ha detto. Non chiedere loro del loro stato con i getter. Dì loro quello che vuoi e conta su di loro per sapere cosa fare. Ciò mantiene il tuo modo di comunicare con gli oggetti polimorfici.

Puoi scrivere un codice simile a questo:

if (pet.getType() == dog) {
  pet.bark();
} else if (pet.getType() == cat) {
  pet.meow();
} else if (pet.getType() == duck) {
  pet.quack()
}

oppure puoi scrivere un codice che assomiglia a:

pet.speak();

e fidati dell'animale domestico per sapere cosa fare.

(I also created a couple of static methods before the main that I call upon throughout the program. Are these in the right place or do should methods be initialized inside of the main?)

Evito i metodi statici. Non sono orientati agli oggetti. Non mi interessa se devo creare una classe senza stato (nessuna variabile membro), preferirei costruire un oggetto stateless e chiamare metodi su di esso, quindi usare un metodo globale come un metodo statico. Ci sono situazioni da incubo in cui questo non può essere evitato, ma questo non lo rende giusto. È meglio lasciare che il principale ti dica quale metodo effettivo chiamerai per dettare quale metodo chiami. Per vedere come può essere fatto Cerca Iniezione di dipendenza .

    
risposta data 12.09.2017 - 10:27
fonte

Leggi altre domande sui tag