Sto scrivendo una classe personalizzata molto semplice per i coupon e ho trovato un layout di base per la classe, che consiste in una serie di piccoli metodi che, in generale, sono una best practice.
Ciò di cui non sono sicuro è come dovrebbe essere dettato il flusso di una classe. In questo momento il codice ha un aspetto simile al seguente:
public function isCouponValid($coupon) {
if (strlen($coupon) != 8) return false;
$query = $this->db->prepare('SELECT coupon_code FROM coupons WHERE coupon_code=:coupon');
try ($query->execute(array(':coupon' => $coupon))) {
while ($row = $query->fetch()) {
return true;
}
} catch (PDOException $e) {
$log->addError('Could not execute SQL query: '.$query.' '.$e->getMessage());
}
return false;
}
public function isCouponUsed($coupon) {
if (self::isCouponValid($coupon)) {
$query = $this->db->prepare('SELECT coupon_used FROM coupons WHERE coupon_code=:coupon');
try ($query->execute(array(':coupon' => $coupon))) {
while ($row = $query->fetch()) {
return ($row['coupon_used'] == '1') ? true : false;
}
} catch (PDOException $e) {
$log->addError('Could not execute SQL query: '.$query.' '.$e->getMessage());
}
}
return false;
}
public function setCouponUsed($coupon) {
if (self::isCouponValid($coupon) && !self::isCouponUsed($coupon)) {
etc...
}
}
Fondamentalmente ho questi controlli integrati nella classe adesso - isCouponUsed () chiama isCouponValid () per verificare che sia valido per primo. È una buona idea, o è meglio per me usare isCouponValid () al di fuori della classe e quindi passare quel valore a isCouponUsed (), tale che isCouponUsed () dovrebbe riguardare solo la convalida di un coupon e non controllare se quel codice è valido per primo?