代码之家  ›  专栏  ›  技术社区  ›  Chris

用于创建一组数据对象的设计模式

  •  2
  • Chris  · 技术社区  · 14 年前

    简单的总结是,我有一些代码在目录结构中遍历一些文件,不同的目录包含不同的内容类型。我的这些内容类型数量有限,目前我有一个内容类型对象,我正在创建许多内容类型对象,以如下方式添加到列表中:

            contentTypes.Add(new ContentType { ContentName = "2010 Call Report", FolderName = "2010 Reports", RenameFile = false });
            contentTypes.Add(new ContentType { ContentName = "2010 Email Report", FolderName = "2010 Reports", RenameFile = false });
            contentTypes.Add(new ContentType { ContentName = "Above Average Call Recording", FolderName = "Call Recordings", RenameFile = true, HasMultiple = true });
            contentTypes.Add(new ContentType { ContentName = "Below Average Call Recording", FolderName = "Call Recordings", RenameFile = true, HasMultiple = true });
    

    这真的感觉不对(总共11行几乎相同的代码),但我想不出我还应该做什么。

    这个 ContentType 类包含上面可以看到的几个属性和一个名为 GetNewFilename 获取新文件名 内容类型 对象有自己的此方法版本。。。

    1) 子类 内容类型 为每个内容类型创建类

    这对我来说似乎不对,因为我有11门课,所有的课都不会改变他们的信息,而且没有必要有超过一门的课。这对一个类来说是不一样的(我知道singleton,但我听说如果你使用它们,你很可能会做错事)。

    Func 上的属性

    我想我可以在 处理 获取新文件名

    3) 工厂等级

    4) 配置文件

    上面的数据可以放在一个配置文件或数据库中,然后加载并循环生成它(这只发生在我身上),但仍然不能解决变化的问题 getNewFilename 方法。我不确定是否可以轻松地将委托放入配置文件中。:)

    5) 在一个类上拥有所有不同的getNewFileName方法

    有人能推荐一个好的方法吗?

    内容类型 类(去掉逻辑-询问您是否认为它相关)。

    public class ContentType
    {
        public string ContentName { get; set; }
        public string FolderName { get; set; }
        public bool RenameFile { get; set; }
        public bool HasMultiple { get; set; }
    
        public string GetNewFilename(string originalFilename, int fileIndex)
        {...} // This method needs to do diffent things for different contenttypes
    }
    

    3 回复  |  直到 14 年前
        1
  •  2
  •   Joel B    14 年前

    有你的 ContentType 类成为基类并使 GetNewFilename 方法虚拟。源自 内容类型 中可能需要特殊处理的每个文件类型的类 获取新文件名 方法并重写虚拟实现。当目录搜索中找到需要特殊处理的文件类型时,只需根据需要创建这些继承类的实例,否则只需创建 上课。

    public class ContentType
    {
        public virtual string GetNewFilename(string originalFilename, int fileIndex)
        {
            // get file name here
        }
    }
    
    public sealed class SpecialContentType : ContentType
    {
        // Inherrits all the properties of ContentType
    
        public override string GetNewFilename(string originalFilename, int fileIndex)
        {
            // get special file name here
        }
    }
    
        2
  •  1
  •   Dave Swersky    14 年前

    如果 GetFileName

    public abstract class ContentType
        {
            public string ContentName { get; set; }
            public string FolderName { get; set; }
            public bool RenameFile { get; set; }
            public bool HasMultiple { get; set; }
    
            public virtual string GetFileName()
            { 
                //Base GetFileName implementation
                return "filename";
            }
        }
    
        3
  •  1
  •   Bryce Fischer    14 年前

    对于#4,可以使用Unity或StructureBuilder之类的IoC容器。然后为第二部分提供一个类:

    public interface INewFilenameService {
      string FileName {get;set;}
    }
    
    public class ContentType {
        private INewFilenameService newFilenameService;
    
        public ContentType(INewFilenameService service) {
            this.newFilenameService = service;
        }
    
        public string ContentName { get; set; }
        public string FolderName { get; set; }
        public bool RenameFile { get; set; }
        public bool HasMultiple { get; set; }
    
        public string GetNewFilename() {
          return service.Filename;
        }
    }
    

    然后可以在配置或运行时实例化内容类型列表。