I wonder why the author did not use an Interface to represent the abstract type FileSystemElement? Isn't using an interface for this type correct?
Sarebbe corretto, nella misura in cui un modello UML valido, come sarebbe usare una classe base astratta. La decisione di progettazione dipende da altri fattori, spesso legati al linguaggio di implementazione.
But an interface cannot have a abstract attribute, so I have to repeat name attribute in both Directory and File classes. Is there any better workaround for this problem?
Un'interfaccia può avere attributi e si presume che siano astratti. Come questi attributi astratti vengono tradotti in codice reale utilizzeranno idiomi diversi per ciascun linguaggio di implementazione e spesso idiomi diversi tra utenti diversi dello stesso linguaggio di implementazione. A livello di UML, non è affatto una limitazione.
As we know, files and directories must have names with similar constraint (e.g. maximum length of 256 characters). Therefore, it would be nice if I model this in the FileSystemElement.
Non vi è alcun motivo per cui non è possibile inserire un vincolo UML su un attributo dell'interfaccia. { Name.Length <= 256 }
può essere messo su un attributo posseduto da un'interfaccia proprio come se si trattasse di un attributo posseduto da un altro classificatore. Il modo in cui verrà implementato sarà diverso sia nel linguaggio di implementazione sia nella strategia di implementazione - forse si dispone di una funzione di validazione che prende un'istanza dell'interfaccia, chiede il nome e verifica la lunghezza. La conversione dei vincoli UML nel codice non segue necessariamente l'eccezione "lanciare un'eccezione se si tenta di chiamare il getter", sebbene spesso lo faccia.
È possibile che l'autore del libro OOSE avesse in mente qualche strategia di implementazione, e quindi utilizza una classe concreta. Molto ciò che farei dipende da che cosa sono le classi - ad esempio, se sono solo segnaposto per i frammenti di percorso e si affidano a qualcos'altro per creare un flusso che apre il file, è possibile testarli completamente senza avere un interfaccia per deridere, quindi non mi preoccuperei di aggiungere altro strato di astrazione. Se avessero avuto operazioni dirette per restituire flussi o eseguire altre operazioni su file system, potrei usare un'interfaccia in modo da poter essere derisi per il test. Né è corretto, e quale è un adattamento migliore per i requisiti non può essere determinato da due diagrammi UML molto piccoli.
Una rapida scansione del libro OOSE che colleghi per confermare che si tratta di diagrammi di classe molto negli stessi termini di ER-Diagrams e considerando di rappresentare le relazioni tra i nomi, non quello che gli oggetti fanno . Vorrei mettere in guardia sul fatto che se si considerano i nomi in relazione statica si sta parlando di codice procedurale piuttosto orientato agli oggetti - forse è per questo che si sta scoprendo che il modello presentato nel libro si concentra su tipi concreti con attributi piuttosto che un'interfaccia di operazioni. O forse sta solo cercando di dimostrare diversi tipi di associazioni e non vale la pena guardarlo troppo profondamente!