instanceof的使用可能是一种代码的味道,我在下面的代码前面,这似乎没问题。你认为在这种情况下不应该使用instanceof吗?使用的模式是什么?
privateAccounts;
} else if($account instanceof PublicAccount) {
$haystack = $this->publicAccounts;
}
foreach($haystack as $someAccount) {
if($account->getId() == $someAccount->getId()) {
return true;
}
}
return false;
}
}更确切地说,$privateAccounts和$publicAccounts是由关系数据库中的ORM延迟加载的对象,因此调用getId()成本很高(每次调用都会产生一个数据库请求)。PublicAccount和PrivateAccount是数据库中的两个表。
使用$haystack = array_merge($privateAccounts, $publicAccounts)将消除instanceof的使用,但会带来性能成本。
发布于 2019-07-18 10:58:30
是的,检查物体的类型是一种代码气味。多态性的全部要点是,您不应该知道类型。
在您的情况下,如果我传入其他派生的帐户类,代码就会中断。
就性能而言,搜索惰性加载列表的过程将非常缓慢。在一般情况下,将其划分为私有帐户和公共帐户并不能真正帮助这一点,因为您很可能会发现,所有的用户都只有私人帐户。
让数据库执行FindAccountByUserIdAndAccountId逻辑,或在用户对象中缓存accountIds列表,以消除此性能问题。
发布于 2019-07-18 12:02:22
与使用instanceof不同,您可能会实现一个isPrivate()帐户上的方法,该方法将在PrivateAccount中实现为return true;,在PublicAccount中实现为return false;。
另一种选择是使用双重分派:
用户将实现方法hasPrivateAccount()和hasPublicAccount(),Account子类将使用这些方法之一实现isAccountOf(),用户的hasAccount()将调用isAccountOf($this)。
发布于 2019-07-20 01:37:37
为什么帐户在两个不同的表中?他们不是有很多共同的专栏,如果不是所有的吗?您不能将公共列放在公共表中,然后加入到辅助表中以解决差异吗?如果需要引用完整性,那么不能使用辅助表之一或使用两列约束(第二个是accountTypeID)吗?还是使用物化索引视图?
我怀疑为什么这段代码需要做一些不同的事情。privateAccount.accounts和publicAccount.accounts还不够吗?你怎么会有publicAccount.privateAccounts,反之亦然?
https://softwareengineering.stackexchange.com/questions/394856
复制相似问题