(Originariamente richiesto su StackOverflow - link )
Mi considero ancora un nuovo arrivato alla programmazione OO, specialmente in PHP, quindi perdonami se ho perso qualche principio fondamentale!
Supponiamo di avere un'applicazione intranet con un oggetto staff
con proprietà e metodi univoci per essere membro del personale:
class staff {
...
private $job_title;
private $start_date;
etc...
}
Nella ricerca di mantenere le parti manutenibili del mio codice in un unico posto, rendere il mio modello di dati più intelligente e rendere il mio codice meno strettamente accoppiato, è ragionevole astrarre ogni proprietà dell'oggetto ad un altro livello?
Ad esempio, mi aspetto che ogni proprietà abbia un value
, ma per complicare le cose, sono interessato anche a cosa label
e description
usare quando ci si riferisce ad esso in applicazioni leggibili. Più interessante è quale type
sia, così come la capacità dell'oggetto di validarsi, se anche le sue proprietà membro possono validarsi. Sembra quindi che le proprietà della maggior parte degli oggetti abbiano molto in comune. Pertanto, la proprietà $start_date
potrebbe effettivamente essere un oggetto in sé:
abstract class property {
public $value = NULL;
protected $label; // A simple label which can be used on user forms, reports, etc.
protected $description; // Some detail to describe what this property is used for
protected $type; // Helps choose the right HTML form control and validate user input
protected $regex; // Regular expression to prompt user entry and validate return value
protected $unique = FALSE; // If TRUE, check for duplicates in the persistence layer
protected $default_value; // Prompt the user when entering new values
protected $HTML_form_element; // Which form element suits this field best?
etc....
}
class start_date extends property {
...
public function __construct(){
...
$this->label = 'Start date'; // Might be an i18n entry
$this->description = 'Enter the date on which the contract starts for this staff member'; // Might be an i18n entry
$this->type = 'VARCHAR(512)'; // Better to use persistence layer's requirements?
$this->regex = '/^([0-9]{1,2})[/.-]([0-9]{1,2})[/.-]([0-9]{2,4})$/'; // UK date
$this->default_value = date('Y-m-d'); // Depends on the business policy of the company
$this->HTML_form_element= 'datepicker'; // Chooses the correct HTML element when building forms automatically
...
}
etc...
}
class staff {
...
public function __construct(){
...
$start_date = new start_date();
...
}
etc...
}
Nelle precedenti applicazioni, queste cose correlate sono vissute in luoghi diversi; variabili globali casuali, codice commentato, oggetti decoratore, un file di configurazione, incorporato in HTML, una tabella di database, un pezzo di carta. Ha senso riunire tutte le proprietà di un oggetto in un unico posto, ma è questo il modo giusto?