首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >代码嗅探

代码嗅探
EN

Software Engineering用户
提问于 2019-07-18 10:45:15
回答 4查看 2.1K关注 0票数 5

instanceof的使用可能是一种代码的味道,我在下面的代码前面,这似乎没问题。你认为在这种情况下不应该使用instanceof吗?使用的模式是什么?

代码语言:javascript
复制
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的使用,但会带来性能成本。

EN

回答 4

Software Engineering用户

回答已采纳

发布于 2019-07-18 10:58:30

是的,检查物体的类型是一种代码气味。多态性的全部要点是,您不应该知道类型。

在您的情况下,如果我传入其他派生的帐户类,代码就会中断。

就性能而言,搜索惰性加载列表的过程将非常缓慢。在一般情况下,将其划分为私有帐户和公共帐户并不能真正帮助这一点,因为您很可能会发现,所有的用户都只有私人帐户。

让数据库执行FindAccountByUserIdAndAccountId逻辑,或在用户对象中缓存accountIds列表,以消除此性能问题。

票数 5
EN

Software Engineering用户

发布于 2019-07-18 12:02:22

与使用instanceof不同,您可能会实现一个isPrivate()帐户上的方法,该方法将在PrivateAccount中实现为return true;,在PublicAccount中实现为return false;

另一种选择是使用双重分派:

用户将实现方法hasPrivateAccount()hasPublicAccount(),Account子类将使用这些方法之一实现isAccountOf(),用户的hasAccount()将调用isAccountOf($this)

票数 0
EN

Software Engineering用户

发布于 2019-07-20 01:37:37

为什么帐户在两个不同的表中?他们不是有很多共同的专栏,如果不是所有的吗?您不能将公共列放在公共表中,然后加入到辅助表中以解决差异吗?如果需要引用完整性,那么不能使用辅助表之一或使用两列约束(第二个是accountTypeID)吗?还是使用物化索引视图?

我怀疑为什么这段代码需要做一些不同的事情。privateAccount.accounts和publicAccount.accounts还不够吗?你怎么会有publicAccount.privateAccounts,反之亦然?

票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/394856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档