首页新闻找找看学习计划

求解集合与成员这种关系下,如何实现修改成员名称

0
悬赏园豆:100 [待解决问题]

已知:集合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; }
        }

    }

 

规定的主页 规定 | 初学一级 | 园豆:102
提问于:2016-10-10 18:06
< >
分享
所有回答(5)
0

post: collection/id/name  "newname"

吴瑞祥 | 园豆:28660 (高人七级) | 2016-10-10 18:14
0

你的问题描述的不够清楚啊 你是基于什么环境? 语言?

一般都是 直接获取item 然后设置Name  根本不需要啥方法啊! 

我想你没能说明白

狂扁小朋友 | 园豆:28 (初学一级) | 2016-10-10 20:06

嗯,我的想法呢,也是item.Name的属性的Set方法中做处理。

但是呢,item的名字本身并没有附加的规则要求,如果在set方法中做判断,这是否违反了单一职责的原则?

支持(0) 反对(0) 规定 | 园豆:102 (初学一级) | 2016-10-10 20:40

@规定: set属性里面写检测代码 和你单独写个set方法, 最后编译成IL都是一样的

一般都是在属性里面写 

支持(0) 反对(0) 狂扁小朋友 | 园豆:28 (初学一级) | 2016-10-10 20:44

@狂扁小朋友:

要解决成员Item的Name属性受Collection限制的问题,Item要引用Collection对象。

比如在Item的构造方法中传入参数myCollection实例,这样Item才能做判断。

我是这么想的。

但是,仅仅就这一点来说,原有的Item的代码已经做不到六原则中对修改关闭了。

 

支持(0) 反对(0) 规定 | 园豆:102 (初学一级) | 2016-10-11 20:49
0

问题描述确实不清楚,给我的感觉是:你是在问一个方法命名的问题,而不是问具体技术问题

顾晓北 | 园豆:9520 (大侠五级) | 2016-10-11 09:25
    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的值不能与集合中的项重名,要如何做才不算违反设计模式六原则。

支持(0) 反对(0) 规定 | 园豆:102 (初学一级) | 2016-10-11 21:04

@规定: 而且你改名的时候根本不知道这个Document在不在MyDocuments里面???

支持(0) 反对(0) 顾晓北 | 园豆:9520 (大侠五级) | 2016-10-12 08:48

@顾晓北: 没错,这也是要解决的一个问题。

支持(0) 反对(0) 规定 | 园豆:102 (初学一级) | 2016-10-12 09:47

@规定: 如果不在,那不是随便改了?

支持(0) 反对(0) 顾晓北 | 园豆:9520 (大侠五级) | 2016-10-12 10:02

@顾晓北: 您说的太对了。这个表面看似极简单的问题,对我来说非常难解决。

我不论怎么做都做不到不违反设计六原则,所以我把这个问题抛到园里来,求大神指导……

支持(0) 反对(0) 规定 | 园豆:102 (初学一级) | 2016-11-17 17:14

@规定: 怎么叫“设计六原则”???你都不把文档纳入manager里面,无论怎么样,都不知道要改的是不是在这里面啊?

支持(0) 反对(0) 顾晓北 | 园豆:9520 (大侠五级) | 2016-11-17 17:18

@顾晓北: 把文档纳入manager里面,这个要怎么做呢?

支持(0) 反对(0) 规定 | 园豆:102 (初学一级) | 2016-11-20 02:58
0

把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");

检测就在集合里做好了

OpportunityLiu | 园豆:255 (菜鸟二级) | 2016-10-18 18:26

感谢您的帮助,又学习到一个知识点:immutable。

不过,immutable这个技术的意思我的理解就是,每次调用指定的方法时,将生成一个新的实例。

这个技术似乎没有解决我提出的问题呢。

我的问题是,基于原始的代码做些修改,实现修改document时校验名称是否唯一。

支持(0) 反对(0) 规定 | 园豆:102 (初学一级) | 2016-11-07 11:14

@规定: 那就通过某种机制在修改Name的时候通知集合好了。

支持(0) 反对(0) OpportunityLiu | 园豆:255 (菜鸟二级) | 2016-11-14 12:34

@OpportunityLiu: 好吧,您终于明白我的问题了。

支持(0) 反对(0) 规定 | 园豆:102 (初学一级) | 2016-11-17 17:08
0

你这么做吧,使用hashset<item>作为你的collection

然后,重写你item类的hashcode

class item{

ovverride int gethashcode(){

return this.name.gethashcode()

}

ovverride equals。。。

}

 

czd890 | 园豆:7453 (大侠五级) | 2016-10-19 23:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册