Relazione tra oggetti

8

Per alcune settimane ho pensato alla relazione tra gli oggetti - non in particolare gli oggetti di OOP. Ad esempio in C ++ , siamo abituati a rappresentarlo mediante la stratificazione di puntatori o contenitori di puntatori nella struttura che richiede un accesso all'altro oggetto. Se un oggetto A deve avere un accesso a B , non è raro trovare un B *pB in A .

Ma non sono più un programmatore C ++ , scrivo programmi usando linguaggi funzionali, e soprattutto in Haskell , che è un puro linguaggio funzionale. È possibile usare puntatori, riferimenti o quel tipo di cose, ma mi sento strano, come "farlo in modo non Haskell".

Poi ho pensato un po 'più a fondo a tutte quelle relazioni e sono arrivato al punto:

“Why do we even represent such relation by layering?

Ho letto alcune persone che ci avevano già pensato ( qui ). Dal mio punto di vista, rappresentare le relazioni attraverso grafici espliciti è meglio perché ci consente di concentrarci sul core del nostro tipo, e di esprimere relazioni in seguito attraverso i combinatori (un po 'come SQL fa).

Per core intendo che quando definiamo A , ci aspettiamo di definire cosa A è fatto di , non ciò che dipende da . Ad esempio, in un videogioco, se abbiamo un tipo Character , è legittimo parlare di Trait , Skill o di quel tipo di cose, ma è se parliamo di Weapon o Items ? Non sono più così sicuro. Poi:

data Character = {
    chSkills :: [Skill]
  , chTraits :: [Traits]
  , chName   :: String
  , chWeapon :: IORef Weapon -- or STRef, or whatever
  , chItems  :: IORef [Item] -- ditto
  }

mi sembra davvero sbagliato in termini di design. Preferirei preferire qualcosa come:

data Character = {
    chSkills :: [Skill]
  , chTraits :: [Traits]
  , chName   :: String
  }

-- link our character to a Weapon using a Graph Character Weapon
-- link our character to Items using a Graph Character [Item] or that kind of stuff

Inoltre, quando arriva un giorno per aggiungere nuove funzionalità, possiamo semplicemente creare nuovi tipi, nuovi grafici e link. Nel primo progetto, dovremmo rompere il tipo Character , o usare un qualche tipo di lavorare per estenderlo.

Cosa ne pensi di questa idea? Quale pensi che sia meglio affrontare questo tipo di problemi in Haskell , un puro linguaggio funzionale?

    
posta phaazon 28.05.2014 - 14:44
fonte

1 risposta

2

In realtà hai risposto alla tua stessa domanda, ma non lo sai ancora. La domanda che stai ponendo non riguarda Haskell ma riguarda la programmazione in generale. In realtà ti stai ponendo ottime domande (complimenti).

Il mio approccio al problema che hai a disposizione si divide fondamentalmente in due aspetti principali: la progettazione del modello di dominio e i trade-off.

Lasciami spiegare.

Progettazione modello di dominio : ecco come si decide di organizzare il modello principale della propria applicazione. Vedo che lo stai già facendo pensando a Personaggi, Armi e così via. Inoltre è necessario definire le relazioni tra di loro. Il tuo approccio di definire gli oggetti in base a ciò che sono invece di ciò su cui dipendono è totalmente valido. Fai attenzione però perché non è una pallottola d'argento per ogni decisione riguardante il tuo design.

Stai sicuramente facendo la cosa giusta pensando in anticipo ma a un certo punto devi smettere di pensare e iniziare a scrivere del codice. Vedrai allora se le tue decisioni iniziali erano quelle giuste o meno. Molto probabilmente non perché non hai ancora piena conoscenza della tua applicazione. Quindi non aver paura del refactoring quando ti rendi conto che certe decisioni stanno diventando un problema, non una soluzione. È importante scrivere il codice mentre pensi a quelle decisioni in modo da poterle convalidare ed evitare di dover riscrivere l'intera cosa.

Ci sono molti buoni principi che puoi seguire, solo google per "principi del software" e tu trova un sacco di loro.

Trade-off : tutto è un compromesso. Da un lato avere troppe dipendenze è sbagliato, ma dovrai affrontare la complessità extra di gestire le dipendenze da qualche altra parte piuttosto che nei tuoi oggetti di dominio. Non c'è una decisione giusta. Se hai un istinto provalo. Imparerai molto seguendo quel percorso e vedendo il risultato.

Come ho detto, stai facendo le domande giuste e questa è la cosa più importante. Personalmente sono d'accordo con il tuo ragionamento, ma sembra che tu ci abbia già dedicato troppo tempo a pensarci. Basta smettere di aver paura di commettere un errore e fare errori . Sono davvero preziosi e puoi sempre refactoring il tuo codice ogni volta che lo ritieni opportuno.

    
risposta data 02.07.2014 - 18:50
fonte

Leggi altre domande sui tag