Modellazione di un gestore account in OOP

5

Ho questo compito di modellare un sistema in cui un gruppo di utenti può tenere traccia delle proprie spese. I requisiti di base sono i seguenti:

  1. Essere in grado di dare credito a un utente.
  2. Trova tutte le transazioni di un determinato utente.
  3. Filtra la transazione in cui l'utente è mutuatario o spender.
  4. Crea un gruppo e metti gli utenti in quel gruppo e poi, quando viene menzionato un gruppo, distribuisci equamente il denaro tra di loro. [TODO]

Ho provato poche cose ma non ne sono affatto convinto.

const trxn = new Array();

class Transaction {
    constructor(amount, from, to) {
      this.timestamp = new Date();
      this.amount = amount;
      this.from = from;
      this.to   = to;
      trxn.push(this);
    }

    toString() {
      let dd = this.timestamp.getDate();
      let mm = this.timestamp.getMonth();
      let yy = this.timestamp.getFullYear();
      return '[Transaction: ${dd}/${mm}/${yy}] ${this.from} Gives ${this.amount} to ${this.to}';
    }
}

class Person {
    constructor(name) {
      this.name = name;
      this._transactions = [];
    }

    transfer(amount, to) {
      let t = new Transaction(amount, this, to);
      this._transactions.push(t);
    }

    transactions() {
      return this._transactions;
    }

    toString() {
      return '${this.name.charAt(0).toUpperCase() + this.name.slice(1)}';
    }
}


function history(transactions, user) {
  return transactions.filter((t) => {
    return t.to.name === user.name || t.from.name === user.name;
  });
}


let amy = new Person('amy');
let foo = new Person('foo');
amy.transfer(500, foo);
amy.transfer(500, foo);
foo.transfer(200, amy);

for (let t of amy.transactions()) {
  console.log('Transaction by AMY');
  console.log(t);
}

for (let f of foo.transactions()) {
  console.log('Transaction by FOO');
  console.log(f);
}

console.log('Transaction history');
console.log(history(trxn, amy));

Output della logica precedente:

Transaction by AMY
[Transaction: 22/10/2016] Amy Gives 500 to Foo
Transaction by AMY
[Transaction: 22/10/2016] Amy Gives 500 to Foo
Transaction by FOO
[Transaction: 22/10/2016] Foo Gives 200 to Amy
Transaction history
[Transaction: 22/10/2016] Amy Gives 500 to Foo,
[Transaction: 22/10/2016] Amy Gives 500 to Foo,
[Transaction: 22/10/2016] Foo Gives 200 to Amy

Come affrontare problemi come questi? Ho letto che basti pensare alla logica di business e non ai dettagli di implementazione, quindi nel mio codice non si fa menzione del meccanismo di consegna e di tutti.

Come posso rendere il mio codice più flessibile e robusto seguendo le pratiche OOP?

    
posta CodeYogi 22.11.2016 - 09:41
fonte

2 risposte

3

Questo suona come il problema contabile standard del doppio libro bancario. Non farti ingannare da tutti i discorsi degli utenti, gli oggetti che stai modellando sono account e hanno transazioni.

ogni volta che effettui un addebito o un credito, crei due transazioni. cioè Amy dà a Beth 100 dollari

Id,AccountId,Value
1,Amy,-100
2,Beth, +100

Se lo desideri, puoi aggiungere un ID di collegamento in più per fornire l'informazione "da dove vengono i soldi"

Id,AccountId,Value,LinkId
1,Amy,-100,1
2,Beth, +100,1
    
risposta data 25.11.2016 - 11:18
fonte
1

Il principale problema di progettazione che riesco a vedere è questo

Transaction by AMY

Per arrivare al tuo problema avrai anche bisogno di una variabile per salvare la somma di denaro di una Persona. Foo era in questa transazione, dovrebbe mettere fuori transazione tra AMY e FOO, al fine di ottenere questo, è necessario rimuovere la Transazione dalla classe Persona, magari dando un ID a ogni Persona e ogni volta che si effettua una nuova Transazione potrebbe assomigliare a questo:

Transaction(Sender, Receiver, Amount)

t = new Transaction(4, 2, 500); //Person with ID 4 transfers 500 to Person with ID 2
transactions.push(t);

Per semplificare le cose dovresti avere un campo di denaro nella tua classe Person. Non sono troppo sicuro di cosa intendi con:

Create a group and put users in that group and then when a group is mentioned then distribute money equally among them

Ma per la mia comprensione, vuoi fare in modo che un gruppo divida i loro soldi in questo modo:

P1 has $500

P2 has $400

P3 has $300

E vuoi trasferire P1 da $ 100 a P3 per distribuire equamente i soldi (questo è quello che capisco). per questo è necessario ottenere la media (in questo caso 400) e scorrere su tutti sopra la media e trasferire denaro verso il basso.

Ecco un altro caso:

P1 has $8

P2 has $7

P3 has $4

P4 has $1

In questo caso la media è $ 5, quindi P1 deve trasferirsi a P4, ma può solo trasferire $ 3 per raggiungere la media, quindi trasferisce $ 3 a P4. Ora sembra piace questo:

P1 has $5

P2 has $7

P3 has $4

P4 has $4

Da quando P1 è stato collegato su P2 ($ 7) a P4, ma solo $ 1 per raggiungere la media di $ 5, e poi da P2 a $ 6, abbiamo ottenuto P3 e lo abbiamo trasferito $ 1. Quindi le transazioni sono andate così:

P1 transferred to P4 $3

P2 transferred to P4 $1

P2 transferred to P3 $1

Speriamo che questo ti aiuti!

    
risposta data 01.12.2016 - 01:44
fonte