如何做扩展的设计?

fwt1314111 2010-07-23 01:51:17
举个简单的例子,

有一个用户发布新闻的功能,

新闻实体

public class News

{

public string ID{get;set;}

public string UserID{get;set;}

public string Name{get;set;}

}

如果说用户发布一个新闻,则是调用逻辑类的AddNews()方法。

现在需要增加一个新需求,要控制用户发布新闻的数量。

最常规的做法就是在用户实体增加一个新闻数量的标记属性,在AddNews()里加入判断控制,同时每则增加一个新闻则改变新闻数量的标记。



我想请教的是:如何在一开始的设计中,就预留这种可能的扩展,在类的设计中应该怎么去做。能做到在新的需求中能最少的改变,实现最小的偶合。

盼高手指教,万分感谢!




问题补充:忽然想到,能不能这样设计:
public interface INews
{
void AddNews();
}
public class NewsRules:INews
{
public virtual void AddNews()
{
HttpContext.Current.Response.Write("添加成功");
}
}

public class NewsFactory
{
public INews GetFactory()
{
return new NewsRules();
}
}
客户端调用:
INews cmd = new NewsFactory().GetFactory();
cmd.AddNews();

如果有新的需求增加,比如以上列举的需求:
增加
public class NewsRules2:NewsRules
{
public override void AddNews()
{
//逻辑判断是否能增加
base.AddNews();
//增加成功,修改用户的发布数量
}
}
修改NewsFactory的GetFactory方法为
public INews GetFactory()
{
return new NewsRules2();
}
客户端调用不需要修改。

向各位大大们请教一下,以上的设计在实际项目中有实用价值吗?会不会有过度设计的嫌疑?
或者有什么更好的方法,能指教一下吗,谢谢
...全文
128 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用楼主 fwt1314111 的回复:]
现在需要增加一个新需求,要控制用户发布新闻的数量。

最常规的做法就是在用户实体增加一个新闻数量的标记属性,在AddNews()里加入判断控制,同时每则增加一个新闻则改变新闻数量的标记。[/Quote]
这个太........味道很坏!

用户发布新闻数量是用户的配置属性,怎么会搞到新闻上去?难道lz你是只匹配最小单位的词,而从不站得远一点看看?
maoliangcai 2010-08-05
  • 打赏
  • 举报
回复
浦东南路昌里路
  • 打赏
  • 举报
回复
嗯,sorry,我没有说清楚大白话!现在把话说明白:

“怎么会搞到新闻上去”应该改为“怎么会搞到用户上去”。

每一个应用都有自己的配置,这是很常见的。这不需要纠结“如何在一开始的设计中,就预留这种可能的扩展,在类的设计中应该怎么去做”。在设计用户系统时,除非你在开发之前就知道当前的系统专为新闻系统而开发,否则用户跟新闻就没有纠结。

用户发布新闻数量不用去搞乱已经开发完毕的用户系统。
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 leslies2 的回复:]
修改NewsFactory的GetFactory方法为
public INews GetFactory()
{
return new NewsRules2();
}
客户端调用不需要修改。

不可能改变Factory的方法,如果这样做就会违背了工厂模式的原意。最简单的修改可以这样做:
增加
public class NewsRules2:NewsRules
{
public ……
[/Quote]

果然,这里演示了胡乱滥用模式,不知所以的设计是多么浪费人的时间和精力。

软件设计就是大白话,而不是八股文。所以先把大白话说好、说得简洁无歧义,而不要学做套中人。
风尘浪子 2010-07-27
  • 打赏
  • 举报
回复
修改NewsFactory的GetFactory方法为
public INews GetFactory()
{
return new NewsRules2();
}
客户端调用不需要修改。

不可能改变Factory的方法,如果这样做就会违背了工厂模式的原意。最简单的修改可以这样做:
增加
public class NewsRules2:NewsRules
{
public override void AddNews()
{
//逻辑判断是否能增加
base.AddNews();
//增加成功,修改用户的发布数量
}
}

public class NewsFactory
{
public INews GetRules(int a)
{
swicth(a)
case 0 :
return new NewsRules();
case 1:
return new NewsRules2();
default:
throw new Exception("....");
}
}

当然也可以采用 Strategy 模式!建议你先深入了解一下开发模式。
yixianggao 2010-07-26
  • 打赏
  • 举报
回复
滥用模式,建议学习敏捷软件开发!

对于 lz 问题,建议采用 Strategy 模式处理即可!

13,190

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 分析与设计
社区管理员
  • 分析与设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧