已知:集合Collection、成员Item(包含Name属性)。
新的需求是:修改成员名称时要保证成员名称在集合中唯一,要如何实现这个功能。
如何做才算符合设计模式的基本原则?
原始的代码如下:
public class Document { private string _name; public string Name { get { return _name; } set { _name = value; } } } public class DocumentManager { public DocumentManager() { _myDocuments = new List<Document>(); Document newDoc; newDoc = new Document() { Name = "Doc1" }; _myDocuments.Add(newDoc); } private List<Document> _myDocuments; public List<Document> MyDocuments { get { return _myDocuments; } set { _myDocuments = value; } } }
post: collection/id/name "newname"
你的问题描述的不够清楚啊 你是基于什么环境? 语言?
一般都是 直接获取item 然后设置Name 根本不需要啥方法啊!
我想你没能说明白
嗯,我的想法呢,也是item.Name的属性的Set方法中做处理。
但是呢,item的名字本身并没有附加的规则要求,如果在set方法中做判断,这是否违反了单一职责的原则?
@规定: set属性里面写检测代码 和你单独写个set方法, 最后编译成IL都是一样的
一般都是在属性里面写
@狂扁小朋友:
要解决成员Item的Name属性受Collection限制的问题,Item要引用Collection对象。
比如在Item的构造方法中传入参数myCollection实例,这样Item才能做判断。
我是这么想的。
但是,仅仅就这一点来说,原有的Item的代码已经做不到六原则中对修改关闭了。
问题描述确实不清楚,给我的感觉是:你是在问一个方法命名的问题,而不是问具体技术问题
public class Document { private string _name; public string Name { get { return _name; } set { _name = value; } } } public class DocumentManager { public DocumentManager() { _myDocuments = new List<Document>(); Document newDoc; newDoc = new Document() { Name = "Doc1" }; _myDocuments.Add(newDoc); } private List<Document> _myDocuments; public List<Document> MyDocuments { get { return _myDocuments; } set { _myDocuments = value; } } }
程序最开始是这个样子。
我可以直接修改Document对象的Name来改个名字,这完全没有问题。
新的需求是,修改Name的值不能与集合中的项重名,要如何做才不算违反设计模式六原则。
@规定: 而且你改名的时候根本不知道这个Document在不在MyDocuments里面???
@顾晓北: 没错,这也是要解决的一个问题。
@规定: 如果不在,那不是随便改了?
@顾晓北: 您说的太对了。这个表面看似极简单的问题,对我来说非常难解决。
我不论怎么做都做不到不违反设计六原则,所以我把这个问题抛到园里来,求大神指导……
@规定: 怎么叫“设计六原则”???你都不把文档纳入manager里面,无论怎么样,都不知道要改的是不是在这里面啊?
@顾晓北: 把文档纳入manager里面,这个要怎么做呢?
把Document改成immutable的可以吗?
类似这样
public class Document { private string _name; public string Name { get { return _name; } } public Document With(string name) { return new Document { _name = name, //拷贝其他字段 }; } }
用的时候
documents[i]=documents[i].With(name:"newName");
检测就在集合里做好了
感谢您的帮助,又学习到一个知识点:immutable。
不过,immutable这个技术的意思我的理解就是,每次调用指定的方法时,将生成一个新的实例。
这个技术似乎没有解决我提出的问题呢。
我的问题是,基于原始的代码做些修改,实现修改document时校验名称是否唯一。
@规定: 那就通过某种机制在修改Name的时候通知集合好了。
@OpportunityLiu: 好吧,您终于明白我的问题了。
你这么做吧,使用hashset<item>作为你的collection
然后,重写你item类的hashcode
class item{
ovverride int gethashcode(){
return this.name.gethashcode()
}
ovverride equals。。。
}