【发布时间】:2019-06-20 12:51:59
【问题描述】:
下面的代码做了我想做的事。 Main 方法中的代码看起来和行为完全符合预期。但是,如果 UserMenu、Home 和 DropdownMenu2 类只能由 HeaderNavigationMenu 使用,以防止其他开发人员试图在 HeaderNavigationMenu 类之外使用它们,那将是更可取的。此外,大多数文章都不愿公开所有内容。
问题: 使用的设计模式是否合适,或者在这种情况下是否有更好、更容易接受的设计模式?
编辑:这种设计的原因。
- 我希望 HeaderNavigationMenu 的最终用户能够使用点符号来获取可用选项的列表。该架构实现了这一目标(例如:navigationMenu.DropdownMenu2.SelectOption3())
- 希望其他最终可能需要编辑代码的人了解 UserMenu、Home 和 DropDownMenu2 类非常专门设计为由 HeaderNavigationMenu 类实现。
public class HeaderNavigationMenu
{
public HeaderNavigationMenu()
{
UsersMenu = new UsersMenu();
Home = new Home();
DropdownMenu2 = new DropdownMenu2();
}
public UsersMenu UsersMenu { get; set; }
public Home Home { get; set; }
public DropdownMenu2 DropdownMenu2 { get; set; }
}
public class UsersMenu
{
...
}
public class Home
{
...
}
public class DropdownMenu2
{
public void SelectOption3()
{
...
}
...
}
static void Main(string[] args)
{
HeaderNavigationMenu navigationMenu = new HeaderNavigationMenu();
navigationMenu.DropdownMenu2.SelectOption3();
// The following code is an example of undesired capability;
// prefer if Home class could only be
// used by HeaderNavigationMenu class
Home home = new Home();
}
【问题讨论】:
-
你说不是所有的事情都应该公开,但一切都是公开的,所以我不明白你的问题。实现这一点的唯一方法是如果它们是私有子类,那会很奇怪。不要试图阻止这种情况,请使用更合适的名称以显示意图
-
@CamiloTerevinto 不会把它们变成私有子类破坏代码吗? OP 在
HeaderNavigationMenu类中公开公开这些类型的属性,因此他们将无法保持这些公开并限制类型,对吧? -
@CodeStranger 这可能会发生,是的,我没有测试过。这更像是一般性评论
-
限制类的使用是什么意思?限制哪些用途——创建实例、某些方法或属性,甚至知道类的存在?将其限制为什么 - 同一程序集中的其他类型,或
HeaderNavigationMenu之外的其他类型?质疑我们暴露了多少以及为什么暴露是件好事,但我们仍然必须有一个理由。我不会这样做,因为普遍反对公开课程。而是想,“如果其他东西可以调用这个方法或创建这个类的实例,会发生什么坏事?” -
感谢您的所有意见。是的,代码中的所有内容都是公开的,我遇到过很多帖子,这些帖子对于公开所有内容非常重要。我想要一些关于最佳实践的指导。你在上面和下面都提出了一些非常好的观点,关于表达意图而不是仅仅因为对这种方法有普遍的负面情绪而不做某事。只是想要一些见解。非常感谢您的想法和智慧。
标签: c# design-patterns architecture