【发布时间】:2011-06-05 19:06:21
【问题描述】:
我有一个应用程序,它本质上是 3rd 方 API 的包装器。该应用不使用数据库,仅存储一个 cookie,即 API 所需的会话 ID。
API 是一个购物系统,允许用户
-登录/注册/编辑个人资料/注销
-购买商品
-捐款
-成为会员
API 有大约 50 个方法,我的应用需要连接到这些方法。示例 API 调用为 addItemToBasket()、addDonation()、GetUserDetails() 等。
我正在尝试确定我的应用程序中应该包含哪些类。这是我目前所拥有的:
类
1) APIManager() 类 包含与第 3 方 API 中公开的方法一一匹配的方法,并提供与远程 API 服务器建立连接的机制。所以用户将通过
登录APIManager->loginUser($sessionKey, $uid, $pwd);
远程 API 会将用户设置为已登录。如果需要,我的应用可以通过调用 API 检查任何会话密钥的登录状态:
APIManager->isLoggedIn($sessionKey);
2) User() 类 这包含包含处理 API 调用(如注册或登录)之前所需的业务逻辑的方法。一个示例方法是:
function login($_POST) {
//perform sanity checks, apply business rules etc.
//if certain conditions are met, we may pass in a promo code, $pc
APIManager->loginUser($sessionkey, $_POST['uid'], $_POST['pwd'], $pc);
}
我意识到我可能只是从登录页面调用 APIManager,而不是拥有 User 类本身,但我觉得因为在我们实际调用 API 的 loginUser() 方法之前需要运行一些业务逻辑,感觉在 User 类中处理它是正确的。我很想知道人们对此有何看法。
3) Basket() 类
购物篮在 3rd Party API 中进行管理,因此我的应用程序的角色是进行适当的 API 调用,以将新商品添加到购物篮、删除商品、查看购物篮等。我的应用程序在获取数据之前对购物篮一无所知从 API 中检索,也不能在不通过 API 的情况下对篮子进行任何更改。同样,将这个相关的逻辑分组到一个 Basket 类中是合适的。前端网页可能会这样调用:
Basket->addItem(23);
Basket 类中的这个 addItem() 方法看起来像:
addItem($itemID) {
//perform checks, apply business rules e.g. if user is eligible for discount
APIManager->addToCart($itemID, $discount);
}
其中 addToCart() 是我们调用来处理商品的第三方 API 方法。
4) Donation() 类
这允许用户进行捐赠。捐赠出现在篮子中,可以从篮子中取出。我想只是在 Basket 类中添加一个 addDonate() 方法,根本不用担心有一个 Donation 对象,但是......(见下文)
5) Membership() 类
...会员资格实际上是一种捐赠! API 会将进入某个帐户的捐款视为 1 年会员资格,而不是普通捐款。我们无法更改 3rd 方 API 的逻辑/行为。
所以,如果我向账户“1”捐赠 50 美元,那么这只是一次普通捐赠,但如果我向账户“8”捐赠 100 美元,那么我将成为会员,享受所有会员福利(降价、免邮费等) .
这就是我不确定最佳设计方法的地方。
我是否应该创建一个 Donation 类,然后使用 Membership 扩展它,因为 Membership 需要所有的捐赠方法。但是 Membership 需要额外的方法,例如 renew() 或 getExpiry() 等。
另外,我应该考虑将用户扩展为会员吗?同样,成员拥有 User 拥有的所有核心方法,但也有其他方法,例如只有成员才能访问的 getSpecialOffers() 或 getDiscountCode()。
非常感谢任何关于如何最好地处理设计的指导。
谢谢,詹姆斯
【问题讨论】:
-
不是您正在寻找的答案,但是在面向对象设计中设计任何东西时对我有帮助的是绘制对象图,找出共性等。如果你这样做在你潜入并编写代码之前,你会发现你的时间要容易得多。从长远来看,您最终会得到一些更易于维护的东西。
标签: php class-design shopping-cart