私は実際にTOがもっとこのように見えることを期待しています:
class User
def increment_points!(points, increment_credits)
@points+=points if increment_credits
@points-=points unless increment_credits
end
end
class Activity
def increment_user_points!
@user.increment_points!(points, true)
end
end
モジュールを作成すると、より複雑にinclude
なるように思われます。そして、デメテルの法則の要点(私はそれをガイドラインとしてもっと考えるのが好きです..)は、クラスの外で多くのコードを書き直すことなく、内部で好きなことをできるべきであるということです。あなたのモジュールはあまり役に立ちません-あなたがの内部をいじるとき、あなたはまだそのコードを書き直すことができます。User
UserDelegator
User
しかし、それが私だったとしたら、に簡単な変更を加えるために多くのコードを書き直していることに気付いていない限り、これを気にすることすらないと思いますUser
。たぶんそれは、私がLinuxカーネルのコーディングスタイルに慣れているからです。これは、定期的にデメテルの法則に違反しています。
static inline int need_reval_dot(struct dentry *dentry)
{
if (likely(!(dentry->d_flags & DCACHE_OP_REVALIDATE)))
return 0;
if (likely(!(dentry->d_sb->s_type->fs_flags & FS_REVAL_DOT)))
return 0;
return 1;
}
3つのオブジェクトが離れています:)そして私はコードが書かれた場合にもっと読みやすくなるかどうかわかりません:
need_reval_dot(dentry) {
if(likely(!dentry_need_reval_dot(dentry))
return 0;
}
dentry_need_reval_dot(dentry) {
return superblock_need_reval_dot(dentry->d_sb);
}
superblock_need_reval_dot(sb) {
return fs_type_need_reval_dot(sb->s_type);
}
fs_type_need_reval_dot(s_type) {
return fs_flags_need_reval_dot(s_type->fs_flags);
}
fs_flags_need_reval_dot(fs_flags) {
return fs_flags & FS_REVAL_DOT;
}
ですから、私はすべて適度にガイドラインに従うことに賛成です-あなたの変更が実際にクリーンでより保守しやすいコードにつながるのか、それともルールに従うためにルールに従っているだけなのかを自問してください。