我打算在我的游戏网站上添加类似Steam的成就。计算将由计划的cron处理,结果存储在典型的MySQL数据库中。为了方便起见,我考虑将所有各种计算方法转储到一个巨大的STATS
类中。这些方法永远不会被网站的任何其他方面调用,只有这个特定的成就cron。
我是否需要担心这门课程变得过大?它现在大约是2k LOC,但是随着时间的推移它没有理由不能扩展到10k或者50k ......
这是在共享主机btw上,因此内存约束在某种程度上确实存在......
答案 0 :(得分:2)
是的,课程肯定会变得太大。
当这种情况发生时,通常是错位责任的标志。做得太多的类是AntiPattern called The Blob aka God class。这些类违反Single Responsibiliy Principle并会对耦合和内聚产生负面影响。这反过来会使您的应用程序不再可重用,并且难以扩展和维护。
要正确划分责任,请考虑将逻辑上组合在一起的数据,然后将其作为单独的对象。过长的方法也是如此。分开他们。如果您发现特定子例程占用了对象中的大量空间,请查看是否可以将该代码提升为封装该算法的策略。
在您的具体情况下,听起来您可以从命令模式中受益,例如:有一个StatsCommander使用许多StatCommands(这是策略)。这保持了使各种统计数据彼此干净地分离所需的逻辑。当您需要添加新的Stat时,只需添加一个新的策略/命令。
答案 1 :(得分:0)
为什么你认为班级会变得太大?
如果您认为可以使用同一个类的多个实例,您可以将所有这些方法设为static
(因此所有函数只有一个实例。)
或者只创建一个实例,让其他实例在原始实例之前使用&
访问同一个实例。
或者您可以考虑使用Singleton Pattern
。
修改强>
你可以考虑创建小班,并让他们成为现在大班的成员。
这将使您的代码保持井井有条,并且相应地对课程进行划分。
答案 2 :(得分:0)
通过创建一个更大的类,你只有泄漏内存的缺点,因为大多数函数都不会被使用,并且会一直存在于内存中直到对象存在,但是如果你创建像Singleton这样的对象很少,那么完善。
一个非常好的事实是,无论你在一个类中有多少函数,你执行单个函数将花费相同的时间来声明一个类中的单个函数并使用它。
我建议你在类之间实现继承,代码组织也是如此,为它做一个OOD。因此,您将花费更少的时间来修改和管理代码。利用封装和多态性:)
答案 3 :(得分:0)
在编写一个类时,你会问自己“这个函数是否需要作为一个实例?或者作为一个全局函数”,最好用一个例子来描述:
class House {
private $door;
private $window;
private static $adverb;
public function __construct(Door $door, Window $window) {
$this->door = $door;
$this->window = $window;
}
public function placeNewDoor($door) {
$this->door = $door;
}
public function placeNewWindow() {
$this->window = $window;
}
public static function advertiseNeighborhood() {
echo "Advertisment! " . self::$adverb;
}
}
会有很多房子,每个房子可能有Door
和Window
。所以每个都获得一个实例方法/属性。但是,您只宣传Neighborhood
一次(不是每个房子),因此该功能是静态的,将由House::advertiseNeighborhood
访问。
为什么我发布这个例子?如果有一个不需要实例化的函数,它们应该保持static
。在实例化多个对象时,它将防止内存泄漏。
至于你的实际问题,拥有一个非常大的课程是完全可以接受的,只要确保你不要过度使用你的记忆。