我的课有什么问题?

时间:2012-02-23 11:19:03

标签: c# oop inheritance

提交这两个类(以及业务逻辑和数据访问逻辑)以进行代码审查。审稿人笑着看着代码并建议我重新上课。他告诉我做一些研究,不会给我任何线索。我找不到任何错误。 “子菜单”是基类而不是菜单看起来有点尴尬。但我的要求就是这样。 。 。菜单只有两个级别(子子菜单永远不会存在)。他们有什么好玩的?如果有人向我展示改进这些课程的途径,将不胜感激。

[Serializable]
public class Menu: SubMenu
{
    private List<SubMenu> _subMenu;
    public List<SubMenu> SubMenu
    {
        get
        {
            if (_subMenu == null)
                _subMenu = new List<SubMenu>();
            return _subMenu;
        }
        set
        {
            _subMenu = value;
        }
    }
}

[Serializable]
public class SubMenu
{
    public int ID { get; set; }
    public string MenuText { get; set; }
    public string MenuURL { get; set; }
    public string ImageURL { get; set; }
}

8 个答案:

答案 0 :(得分:4)

这里最大的问题是谁做了你的评论的专业性 - 你应该要求他们更有建设性和帮助,如果他们仍然坚持如此粗鲁,我会把它带到经理。


那就是说,我对他们在你的设计中看到的东西的猜测是你正在使用继承。你需要继承吗?似乎你可以通过一个Menu类来更好地服务,它包含一个SubMenus列表,没有父子关系或者只是一个MenuItem对象,它可以包含一个自己的列表。

我实际上更喜欢第二种方法,可能是这样的:

[Serializable] 
public class MenuItem
{ 
    public MenuItem()
    {
        MenuItems = new List<MenuItem>();
    }

    public int ID { get; set; } 
    public string MenuText { get; set; } 
    public string MenuURL { get; set; } 
    public string ImageURL { get; set; } 

    // I'm not bothering with the code to protect access to the list
    // in this example but you might want that too...
    public List<MenuItem> MenuItems { get; set; }
} 

答案 1 :(得分:4)

你的对象的整体构造是好的,比如懒惰的实例化,虽然正如其他答案所暗示的那样,我认为你的继承有点领先;但这不是问题!

以下是一些建议;尽管只需要1级深度,但我建议实现更多级别的可用性,因为它并不过分困难,并且可以在将来为您节省时间。另外,我们可以在对象中添加几个构造函数,以便在创建新菜单项时更容易。

我已经创建了一个菜单项的概念,这纯粹是一个建议,但希望它有所帮助。以下是一些需要注意的事项。

  1. 我删除了基础对象
  2. 菜单项现在更长时间使用延迟实例化,但在构建时创建列表
  3. 有新的构造函数
  4. 菜单项可以是无限级别。
  5. 以及它的外观:

    [Serializable]
    public class MenuItem
    {
        public int Id { get; set; }
        public string MenuText { get; set; }
        public string MenuUrl { get; set; }
        public string ImageUrl { get; set; }
    
        public List<MenuItem> Children { get; set; }
    
        public MenuItem(int id, string text, string url)
            : this(id, text, url, String.Empty)
        {
        }
    
        public MenuItem(int id, string text, string url, string imageUrl)
        {
            this.Id = id;
            this.MenuText = text;
            this.MenuUrl = url;
            this.ImageUrl = imageUrl;
    
            this.Children = new List<MenuItem>();
        }
    }
    

答案 2 :(得分:3)

我同意上述评论员的意见。让你的评论者只是笑而不提供任何建设性的建议既粗鲁又适得其反。我的回答是首先从评论者那里“回去并获得专业的建设性建议”。如果这不是即将到来的,那么我担心审稿人看起来像自我,而不是管家和指导和教育的负责人。

答案 3 :(得分:1)

考虑到您的要求,我唯一发现错误的是命名问题:

public List<SubMenu> SubMenu

这是一个集合,它应该是复数。但说真的,没什么可笑的。

现在,如果你回到你的******评论家,请准备好你的论点:

  • 继承PLUS集合是必要的,因为菜单本身就是一个SubMenu,因为菜单有一个Text / Url / Image / ID,并且它有一个子集合在他下面。

  • 解释SubMenu是Menu的基类的要求(实际上并不那么直接)。

我最好的猜测是,它看起来都有点傻,他只是瞥了一眼。

答案 4 :(得分:1)

  

提交这两个类(以及业务逻辑和数据访问逻辑)以进行代码审查。审稿人笑着看着代码并建议我重新上课。他告诉我做一些研究,不会给我任何线索。

糟糕的评论,让你查找它是没有意义的,特别是如果你真的在你自己的代码中没有看到任何错误。

  

我找不到任何错误。 “子菜单”是基类而不是菜单看起来有点尴尬。但我的要求就是......菜单只有两个级别(子菜单永远不会存在)。

我没有发现你的实现很有趣,但是天真虽然有像“从不”这样的东西有点搞笑。如果每当有人说某件事情永远不会发生时,我就有一分钱,并且最终确实发生了,那么我现在至少要有15便士。

如果您的要求是菜单只有两个级别,请不要构建代码以扩展该要求。但是,如果您可以选择非常轻松地打开代码以便将来扩展,那么为什么不这样做呢?没有成本,只是受益。在你的情况下,我认为“开放未来的扩展”确实很简单。

  

他们有什么好玩的?如果有人向我展示改进这些课程的途径,将不胜感激。

这不一定有趣或错误。我会做不同的事情:如果一个菜单可以包含一个菜单,那不是那个组合吗?如果是这样,菜单和子菜单之间有什么区别?子菜单是恰好有父母的菜单,但它应该关心吗?它应该知道吗?它实际上与菜单本身有什么不同的行为吗?

class Menu
  +addSubmenu( Menu menu ) : Menu
  +addItem( Item item ) : Menu

这可能就是我的尝试。

答案 5 :(得分:1)

审稿人没有帮助或专业。虽然彬彬有礼,但你需要明确这样的评论是毫无意义的。当被问及时,有知识/经验的人有责任分享。

我认为您需要查看重命名类型/属性,例如建议将“MenuItem”作为基类名称的答案更清晰。

继承SubMenu之间的混淆(误导,因为你通常从基类或超类继承,取决于你喜欢的术语和做继承的东西是一个子类)并且有一个属性也称为SubMenu和那个property表示集合而不是单个实例。

查看菜单实现,例如winforms - 它们更容易理解

答案 6 :(得分:0)

我不确定我是否对下面的语句是正确的(如果我错了,请纠正我)但如果一个类继承自基类,派生类是否应该保存其基类的项列表?在什么情况下这可能是有用的(我现在想不到任何东西)。如果我想到,例如,“马”和“动物”:马匹应该列出动物名单吗?听起来有点奇怪..

答案 7 :(得分:0)

您似乎有一个菜单可以包含两种类型的项目

1)'简单菜单项'(Id,Text,url,image)
   2)另一个菜单(子菜单)

我知道你只想深入一层,但重新使用通用解决方案实际上可能更简单。

复合设计模式(http://en.wikipedia.org/wiki/Composite_pattern)似乎很合适。

hth,
艾伦。

相关问题