如何做扩展的设计?

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();
}
客户端调用不需要修改。

向各位大大们请教一下,以上的设计在实际项目中有实用价值吗?会不会有过度设计的嫌疑?
或者有什么更好的方法,能指教一下吗,谢谢
...全文
175 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 模式处理即可!
内容概要:本文提出了一种基于混沌系统与DNA编码的复合型彩色图像加密解密方案,旨在解决传统图像加密算法安全性不足及抗干扰能力弱的问题。方案通过混沌系统的伪随机序列对图像像素进行全局置乱,并结合DNA碱基编码的多维扩散特性实现像素值的深层混淆,构建了“置乱-扩散”双重保护机制。研究不仅系统验证了算法在密钥空间、密钥敏感性、信息熵等方面的安全性能,还重点开展了多场景、多强度的抗噪声与抗裁剪性能分析,证实了其在高斯噪声、椒盐噪声干扰及不同位置、面积裁剪攻击下的卓越鲁棒性,弥补了现有研究在实用性方面的不足。; 适合人群:具备一定信息安全、图像处理或密码学基础,从事科研或工程开发的研究生、教师及技术人员。; 使用场景及目标:①为彩色图像在网络传输、医疗影像、军事通信等高安全需求场景下的保密存储与传输提供高鲁棒性加密方案;②为研究复合型图像加密算法的设计与性能评估提供系统性参考; 阅读建议:读者应重点关注混沌与DNA编码的融合机制、加密流程设计以及抗干扰性能的测试方法,建议结合文中提到的仿真结果深入理解算法的实用性与优化方向,并可进一步探索其在视频加密或多模态数据保护中的扩展应用。
内容概要:WiFiSupply斯普莱WFS7000BDAX是一款高性能、电信工业级双射频双频分体式无线基站,支持2.4G和5.8G频段的WiFi6(802.11ax)标准,采用4T4R MIMO架构,双射频最大带宽达2974Mbps,点对点实际吞吐量超过1500Mbps。设备具备高发射功率(单射频28dBm)、超强抗干扰能力、通信延迟≤1ms、支持OFDMA、FastRoaming快速漫游、LD长距离优化协议等核心技术,配合高增益天线可实现3km覆盖或150公里点对点桥接。产品支持宽电压POE供电(12-30V,可选48V),具备IP68防护等级和-45~85℃宽温工作能力,通过多项国家级认证,适用于恶劣环境下的稳定运行。支持胖瘦一体模式、云管理平台、API对接、SNMP、SSH等丰富管理方式,提供多重加密与安全防护机制,适用于工业4.0、智慧物流、智能驾培、AGV小车、车载船载视频传输等复杂场景。; 适合人群:从事工业无线通信、网络工程、物联网系统集成的技术人员及项目决策者,具备一定网络基础知识和现场部署经验的工程师。; 使用场景及目标:①用于远距离无线桥接与大面积无线覆盖,如森林防火监控、智慧交通信号回传;②满足高密度、高移动性终端接入需求,如AMR/AGV小车组网、无人机遥控;③在强电磁干扰或极端气候环境下构建高可靠无线网络,保障视频传输、PLC控制等关键业务连续性;④通过云平台或本地服务器实现集中运维管理和安全认证。; 阅读建议:此文档为产品技术规格说明书,重点在于了解设备性能边界与适用场景,建议结合实际项目需求对照参数选型,并关注其私有协议、安全隧道、抗干扰设计等差异化功能的实际部署配置方法。

13,188

社区成员

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

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