Single Responsability : Non, ta classe MaBibliothèque genre les livres et la traduction.
Open/Close principle : Non, tu as du créer une nouvelle classe pour prendre en compte la traduction qui encapsule ta classe existante, donc partout dans ton code ou tu avais Bibliotheque tu as du remplacer par MaBibliotheque pour pouvoir utiliser la traduction.
Liskov substitution principle : Oui, j'ai l'impression en regardant vite fait.
Interface segregation principle : Oui
Dependency Injection : Non, le développeur aura forcément une porte d'entrée quoi que tu fasses. Même dans ton code j'ai une porte d'entrée si je veux. Réfléchir de cette façon n'est PAS la bonne solution, ça n'a pas de sens.
Pourquoi dans Bibliotheque tu ne stocks pas le livre directement mais chaque propriété du livre séparément ?
Tu as bien plus de chance d'avoir des bugs et soucis.
Et pour preuve :
Comment tu construis un livre avec des paramètres que tu viens de unset ?
La version en Scala :
On peut voir par exemple que ma classe Translation marchera pour autre chose que mes livres.
Tandis que toi, ta classe Translation est encapsulé dans ta Bibliothèque, donc si tu veux l'utiliser ailleurs, tu vas devoir la réencapsulé dans une autre classe, avec les problèmes que ça comporte que j'ai cité.
Moi si j'ai une autre classe, j'aurais rien à faire, juste à utiliser dans mon code Translation(ReadableObject).translate, open/close principle.
Et mon code est testable.
Open/Close principle : Non, tu as du créer une nouvelle classe pour prendre en compte la traduction qui encapsule ta classe existante, donc partout dans ton code ou tu avais Bibliotheque tu as du remplacer par MaBibliotheque pour pouvoir utiliser la traduction.
Liskov substitution principle : Oui, j'ai l'impression en regardant vite fait.
Interface segregation principle : Oui
Dependency Injection : Non, le développeur aura forcément une porte d'entrée quoi que tu fasses. Même dans ton code j'ai une porte d'entrée si je veux. Réfléchir de cette façon n'est PAS la bonne solution, ça n'a pas de sens.
Pourquoi dans Bibliotheque tu ne stocks pas le livre directement mais chaque propriété du livre séparément ?
Tu as bien plus de chance d'avoir des bugs et soucis.
Et pour preuve :
unset($this->titres[$index]);
unset($this->textes[$index]);
return (new Livre($this->titres[$index], $this->textes[$index]));
Comment tu construis un livre avec des paramètres que tu viens de unset ?
La version en Scala :
import scala.collection.mutable.ListBuffer
trait StorageLibrary
{
def store(book: Book): ListBuffer[Book]
def getByTitle(title: String): Option[Book]
}
trait Readable
{
def getTitle: String
def getText: String
def setText(newText: String): Unit
}
case class Book(protected var title: String, protected var text: String) extends Readable
{
def getTitle = title
def getText = text
def setText(newText: String) = text = newText
}
class Storage extends StorageLibrary
{
protected val books = new ListBuffer[Book]
def store(book: Book) = books += book
def getByTitle(title: String): Option[Book] = books.find(_.getTitle == title)
}
class Library(val storage: StorageLibrary)
{
def addBook(book: Book) = storage.store(book)
def getByTitle(title: String): Option[Book] = storage.getByTitle(title)
}
case class Translation(item: Readable)
{
def translate = item.setText(item.getText.toUpperCase)
}
object Main extends App
{
val storage = new Storage
val library = new Library(storage)
val book = Book("Lorem Ipsum", "Lorem ipsum dolor sit amet, consectetur adipisicing elit,...")
val sameBook = Book("Lorem Ipsum", "Lorem ipsum dolor sit amet, consectetur adipisicing elit,...")
library.addBook(book)
val bookFound = library.getByTitle("Lorem Ipsum")
bookFound match {
case None => println("Book not found")
case Some(book) => {
println("Book found : " + book)
println("Book same : " + (book == sameBook))
Translation(book).translate
println("Book translated : " + book)
}
}
}
On peut voir par exemple que ma classe Translation marchera pour autre chose que mes livres.
Tandis que toi, ta classe Translation est encapsulé dans ta Bibliothèque, donc si tu veux l'utiliser ailleurs, tu vas devoir la réencapsulé dans une autre classe, avec les problèmes que ça comporte que j'ai cité.
Moi si j'ai une autre classe, j'aurais rien à faire, juste à utiliser dans mon code Translation(ReadableObject).translate, open/close principle.
Et mon code est testable.