我想知道将大型课程分成不同部分是否值得,并且只在需要时才使用它们。如果是这样,最好的选择是什么?
我不确定在PHP文件中使用大类的资源影响,在启用缓存时对其使用非常有限。也许这不值得,无论班级有多大?
我有两个模型......这个模型需要能够影响父母的#34;变量。我完全清楚这段代码不起作用,我只是想在PHP + pseudo中输入它来解释它而不是伪代码。
class User {
public $id;
public $password;
public $password_hash;
public $post_count;
public function __construct($id) {
$this->id = $id;
}
}
subclass Password of User {
public function set($password) {
parent::$password = $password; }
public function generateHash() {
parent::$password_hash = hash("sha256", parent::$password, true); }
public function validate($password) {
return (hash("sha256", $password, true) === parent::$password_hash); }
}
subclass Post of User {
public function count() {
$db = ConnectionFactory::getFactory()->getConnection();
$sql = $db->prepare("SELECT 1 FROM `Forum_Posts` WHERE `User_ID`=:user");
$sql->execute(array('user' => parent::$id));
parent::$post_count = $sql->rowCount();
return parent::$post_count;
}
}
$some_bloke = new User(3);
$bob = new User(4);
$bob->Password->set('idonthaveaverygoodpassword');
$bob->Password->generateHash();
$lucy = new User(5);
echo $lucy->Post->count();
我还考虑过使用多种特性,但这不是一个很好的解决方案,我担心它会毫无意义地增加内存使用量:
class User {
use BaseUser;
}
class User_Password {
use BaseUser;
use Password;
}
class User_Post {
use BaseUser;
use Post;
}
trait BaseUser {
public $id;
public $password;
public $password_hash;
public $post_count;
public function __construct($id) {
$this->id = $id;
}
}
trait Password {
//stuff
}
trait Post {
//stuff
}
$some_bloke = new User(3);
$bob = new User_Password(4);
$bob->setPassword('idonthaveaverygoodpassword');
$bob->generatePasswordHash();
$lucy = new User(5);
echo $lucy->countPosts();
我也非常愿意就重新命名这篇文章的建议提出建议。我只是不太确定。
答案 0 :(得分:1)
一个可以帮助独立于域的OOP的通用框架称为SOLID。它通常可以通过尝试遵守它定义的每个原则来应用于任何域。话虽这么说,SOLID只是一个框架,代码可以实现坚实的原则,但仍然难以使用:(我将尝试回答它的域名非常通用的应用程序:
单一责任 每个班级只有一个改变的理由。如果更改的散列算法或盐会被隔离到一个点?是。如果需求发生变化且组织不想跟踪内存中的原始密码怎么办?不需要。用户和密码都需要更改。
打开/关闭强> 我们如何创建新类型的帖子,用户或密码?如果企业想要添加一个不需要密码的未经身份验证的用户,该怎么办?可以在不修改用户模型的情况下在系统中建模吗?如果未经身份验证的用户总是有0个帖子怎么办?
Liskov Substitution 这表明,所有对象都应该可以替换其子类型的实例。这通常仅在创建使用域对象的代码时进行验证。在这种情况下:
$some_bloke = new User(3);
$bob = new User(4);
$bob->Password->set('idonthaveaverygoodpassword');
$bob->Password->generateHash();
$lucy = new User(5);
echo $lucy->Post->count();
如果$bob
是Post
的实例,则无法使用Password
User
的子类实例化$lucy
,Password
也是User
的实例。 1}}是{{1}}的实例,而不是{{1}}。
界面隔离
依赖性倒置
总的来说,我觉得内存使用对于更高级别(非嵌入式)的应用程序来说应该不是问题。我发现,即使是移动设备,抽象和可维护性也比最小化内存使用更重要。
此外,基于继承的层次结构很容易变得笨拙和脆弱。组合(更像是你的第二个建议)可能有助于实现SOLID并最大限度地减少脆性。可以为用户提供密码策略,该策略将定义用于生成密码的接口,并允许密码生成实现改变,并使用户不受影响。想要生成密码的用户可以委托他们的特定策略。