【问题标题】:Which function architecture is the best for maintainability in this simple case?在这种简单情况下,哪种功能架构最适合可维护性?
【发布时间】:2011-01-11 23:49:32
【问题描述】:

我正在向其他人编写的在线购物车添加“促销代码”功能。这是一个非常棘手的鼠标架构问题,但我想听听一些意见。我的三个想法都行得通,但您认为哪个最有利于可维护性?

所以,这是促销代码的基本表结构:

CREATE TABLE `promocodes` (
    `promocode_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `promocode` VARCHAR( 255 ) NOT NULL ,
    `description` VARCHAR( 255 ) NULL ,
    `discount_percentage` INT NULL ,
    `discount_dollars` DECIMAL( 6, 2 ) NULL ,
    `expiration_date` DATE NULL ,
    `uses_remaining` INT NULL ,
    `is_active` BOOL NOT NULL DEFAULT '1'
)

什么是最聪明的(不要过于复杂):

使用 SQL 检查是否存在,其他所有内容单独在代码中

// LIBRARY
function promoCodeExists($promoCodeString){
  // make sql call
  return $promoCodeDetailsHash; // or false if no record
}

function isPromoCodeUsable($promoCodeDetailsHash){
  // check expiry date and number of uses left and active / inactive
}

function usePromoCode($promoCodeId){
  // do order association
  // decrement uses left
}

// USAGE 
$promoCodeDetailsHash = promoCodeExists($promoCode);
if (is_array($promoCodeDetailsHash) AND isPromoCodeUsable($promoCodeDetailsHash)){
  usePromoCode($promoCodeDetailsHash['id'])
} else {
  // invalid promo code
}

或者,有一个验证函数,但只能由 get 函数调用:

// LIBRARY
function validatePromoCode($promoCodeDetailsHash){
  // check expiry date and number of uses left and active / inactive
}

function isPromoCodeUsable($promoCodeString){
  // make sql call
  return validatePromoCode($promoCodeDetailsHash); // or false if no record
}

// USAGE 
$promoCodeDetailsHash = promoCodeExists($promoCode);
if (is_array(isPromoCodeUsable($promoCodeDetailsHash))){
  usePromoCode($promoCodeDetailsHash['id'])
} else {
  // invalid promo code
}

检查 SQL 中的所有内容,无效与不存在相同:

// LIBRARY
function getDetailsForUsablePromoCode($promoCode){
  // use SQL WHERE clauses to only return existence for currently valid promo codes
  // or false if no result
}

// USAGE
$promoCodeDetailsHash = getDetailsForUsablePromoCode($promoCode)
if (is_array($promoCodeDetailsHash)){
  usePromoCode($promoCodeDetailsHash['id'])
} else {
  // error state
}

请随时在此处指出任何其他方法或古怪之处。

【问题讨论】:

    标签: php sql architecture refactoring


    【解决方案1】:

    在我的应用程序中,我将其创建为 2 个表。第一个表就像你一样,但只将usage_limit 保存为整数。在第二个表中,我将保留用法,每行一个用法。

    promocode_usage 表中,我将promocode_id 作为外键,以及其他必需的列,例如使用日期时间、用户ID 等。要检查促销是否仍然可用,我将简单地count promocode_usage 表中包含 promocode_id 我想检查的行。如果结果小于usage_limit 值,则可以使用促销。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-06
      • 2010-11-21
      • 2019-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-30
      • 2023-03-10
      相关资源
      最近更新 更多