Il "file" partecipa anche al principio di open closed?

1

Lo so secondo il principio di open closed, qualcosa come la classe, l'interfaccia, il codice .... dovrebbe essere invariato quando aggiungi nuove funzioni o contenuti, ma è anche un file in questo caso?

Stavo progettando un gioco, il gioco ha alcune informazioni sui mostri e il gioco (nel lato client) può scaricare o sostituire alcuni file se ci sono nuovi mostri da aggiungere o aggiornare.

Ero preoccupato di quale dovrebbe essere il formato delle informazioni sui mostri: 1 file con tutte le informazioni sui mostri o ogni mostro ha un singolo file?

1. Memorizza tutte le informazioni dei mostri in un singolo file (ad esempio: monsterlist.json), ogni volta che aggiungi un nuovo mostro sostituirà il file, ad esempio:

{  
    "monsterList":[
        {
            "id":1,
            "hp":100,
            "attack":230,
        },
        {
            "id":2
            "hp":500
            "attack":980
        }
    ]
}

2. Ogni mostro ha un singolo file, ogni volta che aggiungi un nuovo mostro verrà aggiunto anche un nuovo mostro:

monster1.json

{
    "id":1,
    "hp":100,
    "attack":230,
}

monster2.json

{
    "id":2,
    "hp":500,
    "attack":980,
}

All'inizio credo che il caso 1 sia più comodo, perché quando aggiungo o aggiorno qualsiasi mostro ho solo bisogno di sostituire monsterlist.json, ma per il caso 2, ho bisogno di sapere quale json è nuovo (potrebbe aver bisogno di una riga aggiuntiva per memorizzare lo stato di aggiornamento nel database del server).

Ma improvvisamente ricordo principio aperto e chiuso, l'aggiunta di qualcosa di nuovo non dovrebbe modificare il contenuto attuale, non sembra ragionevole sostituire un file quando viene aggiunto un nuovo mostro.

Nota: non sto chiedendo quale formato è migliore (che è basato sull'opinione pubblica), l'esempio sopra è solo le informazioni di base per illustrare il motivo per cui avrei questa domanda. La cosa che voglio chiedere è solo: il "file" partecipa anche al principio di open closed?

    
posta ggrr 11.09.2015 - 06:56
fonte

2 risposte

7

Risposta breve

No. Il principio Aperto / Chiuso si applica ai costrutti software orientati agli oggetti come le classi, non i dati.

Risposta lunga

Quando valuti schemi e principi di programmazione, è importante capire perché il principio è stato creato in primo luogo, come si applica alla programmazione e a cosa si applica esattamente. Senza questa comprensione, è molto facile conoscere un principio per la prima volta, pensare che si applichi a tutto e applicarlo indiscriminatamente o persino in un modo che possa causare danni.

Ad esempio, la frase "l'ottimizzazione prematura è la radice di tutti i mali" è sempre usata impropriamente per dire cose come "non ottimizzare fino a tardi" o, peggio, applicato alle cose per il quale non ha alcuna rilevanza, come ad esempio un design software sensibile. Ciò che la frase significa in realtà è "misurare prima, quindi ottimizzare solo quelle parti del codice che le tue misurazioni dicono produrranno benefici tangibili". Fin dall'inizio, non dice nulla di non seguire i principi del design. Inoltre, non è in realtà l'intera frase, quindi un significato è perso se questo è tutto ciò che citi.

Detto questo, esaminiamo il principio Open / Closed.

In object-oriented programming, the open/closed principle states "software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification 1

La programmazione orientata agli oggetti, come implica il principio, riguarda principalmente i dati code, not . Alcuni lettori sostengono che "il codice è dati" o che "alcuni dati ha caratteristiche orientate agli oggetti come l'ereditarietà ", che sono entrambe vere. Ma il principio di cui stiamo parlando è destinato ad essere utilizzato nel contesto della programmazione orientata agli oggetti nel senso tradizionale, non come principio da applicare ai dati.

Il principio Aperto / Chiuso è l'O in SOLID , i cinque principi che, quando applicati insieme in una progettazione software orientata agli oggetti, intendono rendere più probabile che un programmatore crei un sistema facile da mantenere ed estendere nel tempo. 2

Single responsibility principle

A class should have only a single responsibility (i.e. only one potential change in the software's specification should be able to affect the specification of the class)

Open/closed principle

"Software entities should be open for extension, but closed for modification."

Liskov substitution principle

"Objects in a program should be replaceable with instances of their subtypes without altering the correctness of that program." See also Design By Contract.

Interface segregation principle

“Many client-specific interfaces are better than one general-purpose interface.”

Dependency Inversion Principle

“Depend upon Abstractions, not on concretions.”

Si noti la formulazione di questi principi. Tutti si riferiscono a "entità software:" classi, moduli, funzioni, interfacce e così via, tutti punti fondamentali del paradigma orientato agli oggetti. Questi non sono dati, nel senso tradizionale, sebbene possano contenere dati. I dati seguono un diverso insieme di regole e un diverso vocabolario: immutabilità, atomicità, durabilità, ecc.

Leggi Codice pulito di Robert C. Martin e otterrai un'ottima prospettiva sul contesto appropriato in cui vengono utilizzati questi termini.

1 Meyer, Bertrand (1988). Costruzione di software orientata agli oggetti. Prentice Hall. ISBN 0-13-629049-3.

2 "SOLID Object-Oriented Design", Sandi Metz (Duke University), discorso tenuto alla Gotham Ruby Conference 2009 nel maggio 2009.

    
risposta data 11.09.2015 - 07:36
fonte
1

Anche se penso che la risposta di @ RobertHarvey sia davvero buona, vorrei aggiungere una risposta da un punto di vista più pratico.

La risposta alla tua domanda dipende semplicemente da come si mappano i costrutti OO ai file. Se le classi sono in rapporto 1: 1 con i file, "cambio di classe" significa "cambio di file", non c'è differenza. Se si memorizzano tutte le classi di un livello o tipo specifico in un file e si desidera aggiungere un'altra classe, è ovviamente necessario modificare il file quando si aggiunge un'altra classe. E quando non hai nemmeno i file (perché il tuo codice è memorizzato, ad esempio, in un database), è abbastanza ovvio che i file non partecipano all'OCP.

    
risposta data 11.09.2015 - 08:40
fonte

Leggi altre domande sui tag