Classe data only, altre classi che lo leggono / modificano?

0

Ho una classe che contiene solo dati, in particolare raccolte di dati, si chiama * BezierSplineData :

class BezierSplineData
{
    public List<BezierSplineControlPoint> ControlPoints; // ControlPoints that can change the shape of the spline.
    public List<BezierSplinePoint> Points; // Actual points in the 3D world that represent the spline.
}

BezierSplineControlPoint ha solo 3 campi:

  • posizione
  • FirstTangentPosition
  • SecondTangentPosition

BezierSplinePoint solo 1:

  • posizione

Un'altra classe chiamata BezierSplineCalculator , viene utilizzata per calcolare i punti 3D per un set di BezierControlPoint.

class BezierSplineCalculator
{
    public BezierSplineData Data;

    private void Recalculate()
    {
        // Code that will recalculate the Data.Points based on the Data.ControlPoints;
        // Essentially generates the actual spline.
    }
}

Ora la classe BezierSplineCalculator può avere metodi come AddControlPoint (BezierSplineControlPoint controlPoint) e altri metodi come RemoveControlPoint , InsertControlPoint e probabilmente di più, ciò causerebbe un ricalcolo della spline.

La mia domanda è, non sembra giusto che io abbia una classe separata solo per quello, dato che dovrei fare riferimento a questi Dati abbastanza spesso, diciamo che ho bisogno di renderizzare BezierSpline, vorrei creare un BezierSplineRenderer classe e accedi al campo Dati della classe BezierSplineCalculator .

Si tratta di un odore di codice che tiene conto del fatto che queste classi sono correlate (da vicino credo), dovrei mantenere i dati e la calcolatrice in una classe?

    
posta Joao Vitor 22.12.2018 - 16:49
fonte

5 risposte

5

A volte.

Occasionalmente, questa separazione è strana e limitante e crea un sovraccarico quando sempre usa i due insieme. Non è tradizionale "Car has Wheels" OO.

Ma in questi giorni con gli ideali di programmazione più funzionali che entrano in OO, può essere buono. Gli oggetti Data Transfer Objects (DTO) e Plain Ol 'C / Java sono queste semplici strutture di dati che vengono quindi utilizzate da altre cose. Questo può offrire molta flessibilità e offre molti vantaggi quando i dati devono essere serializzati su altre macchine o su disco (come spesso accade ai dati).

Per lo scenario questo , mi aspetterei che il renderer abbia delle forti dipendenze dalle librerie di disegni. E ho potuto vedere degli scenari in cui hai delle utility che in realtà non disegnano le cose, semplicemente le manipolano. Separare i dati dal disegno può farti rompere questa dipendenza.

O non lo farai mai ed è tutto eccessivo.

In generale, mi sbaglierei verso altre classi più piccole.

    
risposta data 22.12.2018 - 18:32
fonte
1

Quello che stai descrivendo è conosciuto come un "Modello di dominio anemico" come descritto da Martin Fowler.

link

In genere, questo modello di progettazione rientra nella categoria non prefferata.

    
risposta data 22.12.2018 - 18:00
fonte
1

Qualcosa di utile da considerare qui è l' invariante di classe : quali sono i vincoli sui possibili stati di un oggetto?

In questo caso, Points deriva da ControlPoints , quindi questi due campi non sono indipendenti. Rendendo pubblici i campi, è possibile che un client esterno li imposti su valori che in realtà non hanno senso nel contesto di una spline di Bézier. Questo è uno dei motivi principali per l'incapsulamento, ti permette di esporre metodi scelti con cura che sono garantiti per mantenere invariata la classe.

Pertanto, direi che ha senso avere una singola classe chiamata BezierSpline , che ha metodi per aggiungere / rimuovere punti di controllo e ottenere i punti effettivi (ma non un modo diretto per impostare i punti effettivi).

    
risposta data 22.12.2018 - 21:00
fonte
0

Quello che stai descrivendo è una collezione. Quindi guarderei altre raccolte.

Quando si guarda ad esempio: Arraylist, i metodi per mutare la collezione fanno parte della classe. Pensa a aggiungi, inserisci, ordina.

I metodi per la modifica degli elementi di raccolta non fanno parte della classe.

Per non sorprendere i tuoi successori, rimango con C # -way e aggiungo i mutanti di classe.

    
risposta data 24.12.2018 - 11:31
fonte
0

Ogni volta che hai classi con nomi come SomethingData, SomethingHandler, SomethingComputer, SomethingCalculator o lo schema più generale di Something + Verb, hai un odore di codice.

In generale, sarebbe meglio servire riducendo le classi di Verb e usando una classe Noun: BezierSpline e spostando i verbi per diventare metodi pubblici della classe Noun: BezierSpline.getPoints (), BezierSpline.render () , ecc. Questo segue il principio di "raccontare, non chiedere".

    
risposta data 24.12.2018 - 13:37
fonte

Leggi altre domande sui tag