OOP - Classe Manager separata

3

Ho iniziato a utilizzare OOP in PHP di recente. Per ogni modello, creo due classi. Una classe per le operazioni di lettura e un'altra classe Manager per tutte le operazioni di creazione / aggiornamento / eliminazione. Ad esempio,

<?php
// This is a sample class, just to convey the idea
class Image {
    public static function loadById() {}
    public static function loadByName() {}
    public static function search() {}

    public function __construct () {}
    public function __get () {}
    public function getData() {}
    public function getRating() {}
    public function getSimilar() {}
    public function getRelatedNews() {}
}

class ImageManager extends Image {
    public function __construct() {}
    public function __set() {}
    public function remove() {}
    public function update() {}
    public function save() {}
    private function updateSomethingElse() {}
}
?>

Il motivo per cui ho diviso questo in due classi era che pensavo fosse un po 'più sicuro, dal momento che non esponeva i metodi C / U / D a un utente normale. Inoltre, ho pensato che questo potrebbe essere più veloce / efficiente in memoria dal momento che sto caricando solo la classe più piccola per il 95% delle richieste. Ma ora penso che queste ragioni siano troppo insignificanti per mantenere due file.

È una cattiva pratica? Normalmente, le classi Manager vengono caricate solo durante le operazioni di amministrazione. Le azioni dell'utente aggiornano raramente il database (tranne forse durante un'operazione di classificazione o un processo cron per aggiornare il conteggio delle visualizzazioni). Devo combinare entrambe le classi nella classe Image ?

    
posta Joyce Babu 16.03.2013 - 08:41
fonte

2 risposte

2

Sembra un po 'come architettura DCI . Così la struttura simile è usata da alcune persone. Ha alcuni vantaggi legati alla sicurezza e il dover "mantenere" più file è spesso la cosa migliore rispetto a un singolo file con molte funzioni. Li ho divisi a volte solo per quella ragione.

Anche se non mi aspetterei molto per la velocità o la memoria. Il tuo framework o qualsiasi altra cosa che utilizzi dovrebbe memorizzare nella cache il progetto in ogni caso e caricare una singola immagine molto probabilmente usa più memoria e impiega più tempo di quei pochi byte.

    
risposta data 16.03.2013 - 17:33
fonte
2

I miei due centesimi. È una buona idea separare "esecutori" da "obiettivi di esecuzioni" in generale. Questa è l'idea principale del paradigma MVC e perfettamente sintetizzata dal Principio di responsabilità singola nella programmazione orientata agli oggetti (per l'altro "leggi" vedi qui ).

Nel tuo caso però, non lo stai facendo davvero. Il tuo ImageManager non ha realmente la sola responsabilità di C / U / D le tue immagini. Ottiene anche il punteggio, ottiene il simile (immagini salvate da qualche parte?) E (credo) memorizza i dati dell'immagine. Questo perché eredita Immagine (penso di aver appena sentito qualcosa : D).

Quello che farei, che è più verboso ma molto più modulare, flessibile e SOLID , sarebbe quello di memorizzare tutti i miei dati in una classe ImageStorage e poi avere molti * Manager che accettano un ImageStorage (o matrice di essi) come input ed esegui le loro operazioni su di essi (loro).

Tuttavia, il tuo primo pensiero è corretto (imho), non una cattiva pratica. Dovresti espandere questa idea e iniziare a scrivere il codice OO in questo modo.

    
risposta data 16.03.2013 - 18:40
fonte

Leggi altre domande sui tag