问题是您的对象不遵循OOP规则.
首先,getters and setters are evil因为它们暴露了对象的内部结构.您只需介绍依赖于系统其余部分的内部用户对象结构的无限可能性.虽然该对象的目的是隐藏实现细节并提供操作此隐藏数据的接口.
而null is evil(或a billion dollar mistake)因为它使代码更不可靠.
它介绍了特殊情况(null返回值),并且必须在使用您的对象的代码中处理这种特殊情况.
更糟糕的是,如果你忘记处理这个“空”特殊情况(或者如果你不知道有特殊情况),你将不会立即得到错误.
因此,您将获得隐藏的错误,这可能非常耗时,无法找到并修复.
实际上,我看到以下选项(在所有情况下 – 删除getter):
选项1)以统一的形式获取配置文件数据的快照
$user->getProfileData() {
return [
'username': $this->username,
'realName': $this->realName ? $this->realName : '',
'address': $this->address ? $this->address : 'Not specified'
...
];
}
这仍然是一种吸气剂,但您将所有数据转换为统一形式(字符串).即使数据库中有一些浮点字段的整数(如年龄或高度),您仍然会在此处返回字符串,因此系统的其余部分不依赖于对象的实际内部.
可选字段的空字符串(或类似“未指定”的特殊值)也充当一种“空对象”.也可以将返回的值包装到小字段对象中,并实际使用空对象模式作为可选字段.
在使用该类的代码中,您不应该处理特殊的“null”情况,只需循环遍历字段并显示字符串(包括那些空字符串).
选项2)使对象本身负责演示
$user->showProfile($profileView) {
$profileView->addLabel('First Name');
$profileView->addString($this->username);
...
}
在这里你保留对象内部的细节,但现在它做了太多,所以有人可能会说它现在违反了SRP.
选项3)创建负责演示的特殊对象
$userPresentation = $user->createPresentation()
// internally it will return new UserPresentation($this->username, this->realName, $this->address, ...);
// now display it - generate the template and insert it into the view
echo $userPresentation->getHtml(); ?>
在这里,您将表示逻辑移动到单独的对象中.用户对象和它的表示是紧密耦合的,但系统的其余部分现在对用户对象内部结构一无所知(并且没有机会知道).