ปิดครั้งแรกโปรดทราบว่าทำอะไรเช่นentity.underlyingEntity.underlyingEntity.method()
นี้ถือว่าเป็นกลิ่นรหัสตามกฎหมายของ Demeter ด้วยวิธีนี้คุณจะเปิดเผยรายละเอียดการใช้งานจำนวนมากแก่ผู้บริโภค และความต้องการในการต่อเติมหรือดัดแปลงแต่ละอย่างของระบบจะส่งผลเสียอย่างมาก
เพื่อให้ที่ฉันขอแนะนำให้คุณมีHasRole
หรือIsAdmin
วิธีการUser
ตามความคิดเห็นของ CodesInChaos ตาม ด้วยวิธีนี้วิธีการใช้บทบาทในผู้ใช้ยังคงมีรายละเอียดการใช้งานสำหรับผู้บริโภค และยังรู้สึกเป็นธรรมชาติมากกว่าที่จะถามผู้ใช้ว่าบทบาทของเขาคืออะไรแทนที่จะถามเขาเกี่ยวกับรายละเอียดของบทบาทของเขาแล้วตัดสินใจตามนั้น
โปรดหลีกเลี่ยงการใช้งานstring
หากไม่จำเป็น name
เป็นตัวอย่างที่ดีของstring
ตัวแปรเนื่องจากเนื้อหาไม่เป็นที่ทราบล่วงหน้า ในทางตรงกันข้ามสิ่งrole
ที่คุณมีค่าแตกต่างกันสองค่าซึ่งเป็นที่รู้จักกันดีในเวลารวบรวมคุณควรใช้การพิมพ์ที่ดีกว่า นั่นคือสิ่งที่ประเภทการนับเข้ามาเล่น ...
เปรียบเทียบ
public bool HasRole(string role)
กับ
public enum Role { Admin, User }
public bool HasRole(Role role)
กรณีที่สองทำให้ฉันมีความคิดเพิ่มเติมเกี่ยวกับสิ่งที่ฉันควรจะผ่านไป นอกจากนี้ยังป้องกันไม่ให้ฉันผ่านผิดพลาดstring
ในกรณีที่ฉันไม่รู้เกี่ยวกับค่าคงที่บทบาทของคุณ
ต่อไปคือการตัดสินใจว่าบทบาทจะมีลักษณะอย่างไร คุณสามารถใช้ enum ที่จัดเก็บโดยตรงกับผู้ใช้:
public enum Role
{
Admin,
User
}
public class User
{
private Role _role;
public bool HasRole(Role role)
{
return _role == role;
}
// or
public bool IsAdmin()
{
return _role == Role.Admin;
}
}
ในทางกลับกันถ้าคุณต้องการให้บทบาทของคุณมีพฤติกรรมตัวเองมันควรจะซ่อนรายละเอียดของการตัดสินใจประเภทของมันอีกครั้ง:
public enum RoleType
{
User,
Admin
}
public class Role
{
private RoleType _roleType;
public bool IsAdmin()
{
return _roleType == RoleType.Admin;
}
public bool IsUser()
{
return _roleType == RoleType.User;
}
// more role-specific logic...
}
public class User
{
private Role _role;
public bool IsAdmin()
{
return _role.IsAdmin();
}
public bool IsUser()
{
return _role.IsUser();
}
}
อย่างไรก็ตามนี่เป็นคำพูดที่ค่อนข้างละเอียดและความซับซ้อนจะเพิ่มขึ้นตามการเพิ่มบทบาทแต่ละครั้ง - ซึ่งมักจะเป็นวิธีที่รหัสสิ้นสุดเมื่อคุณพยายามปฏิบัติตามกฎหมายของ Demeter อย่างเต็มที่ คุณควรปรับปรุงการออกแบบโดยยึดตามข้อกำหนดที่เป็นรูปธรรมของระบบที่มีการจำลอง
ตามคำถามของคุณผมคิดว่าคุณควรที่จะไปกับตัวเลือกแรกกับ enum User
โดยตรงบน หากคุณต้องการตรรกะเพิ่มเติมเกี่ยวกับRole
ตัวเลือกที่สองควรพิจารณาเป็นจุดเริ่มต้น
User.HasRole(Role.Admin)
ฉันอยากจะใช้สิ่งที่ต้องการ