【问题标题】:Keeping data and formatting separate in object oriented design在面向对象设计中保持数据和格式分离
【发布时间】:2012-08-19 13:06:30
【问题描述】:

我正在创建一个程序,其中有一个名为“层次结构”的对象,它只不过是一个带有字符串 (ArrayList<ArrayList<String>>) 的列表和适当的 getter。

用户应该能够选择这些层次结构的表示/格式 - 例如在写入文件之前,层次结构 [1,2,3,4] 是否应表示为 {1,2,3,4} 或 (1-4) 或其他。

是否有一种聪明/标准的方法来进行这种数据和格式的分离?我正在考虑创建一个“FormattedHierarchy”对象,它仅由一个层次结构对象和一个格式化对象组成,但我不知道这是否是一个好的设计选择。

感谢任何指针/提示/答案。

【问题讨论】:

    标签: java object-oriented-analysis


    【解决方案1】:

    您可以做的最糟糕的事情是将层次结构数据表示与格式结合起来。层次结构类不应该知道关于格式的任何事情。我的建议是创建一个单独的接口HierarchyFormatter,并使用几种不同的实现。

    我认为代码值千言万语:

    public interface HierarchyFormatter {
        String format(Hierarchy hierarchy);
    }
    
    public class BraceFormatter implements HierarchyFormatter {
        public String format(Hierarchy hierarchy) {
            //...
        }
    }
    
    public class RangeFormatter implements HierarchyFormatter {
        public String format(Hierarchy hierarchy) {
            //...
        }
    }
    

    这称为strategy design pattern。如果某些代码需要格式化您的层次结构,只需传递 HierarchyFormatter 的实例 - 任何实例。

    如果您想用某种格式永久绑定层次结构,请使您的格式化程序有状态:

    public abstract class HierarchyFormatter {
        protected final Hierarchy hierarchy;
    
        public HierarchyFormatter(Hierarchy hierarchy) {
            this.hierarchy = hierarchy;
        }
    
        public abstract String format();
    }
    
    public class BraceFormatter extends HierarchyFormatter {
        public String format() {
            //...
        }
    }
    
    public class RangeFormatter extends HierarchyFormatter {
        public String format() {
            //...
        }
    }
    

    每次创建格式化程序时,都将层次类封装在其中。

    【讨论】:

    • “你能做的最糟糕的事情是将你的层次结构数据表示与格式化相结合。层次结构类不应该知道任何关于格式化的事情。” - 正如我所怀疑的那样,但不知道该怎么做。但是如何将不同的格式与层次结构联系起来?取决于我还是什么?如果这不是一个坏主意,我可能会使用地图。暂时接受这一点,有人将不得不想出更好的东西来改变这种情况。谢谢!
    • @TheUnfunCat:显然格式化程序需要了解层次结构数据,但反过来则不然。我更新了我的答案,以提示您如何将某些格式化程序与给定的层次结构实例永久绑定。您也可以使用层次结构中的简单 ma -> 格式化程序。
    【解决方案2】:

    您可以将其视为模型视图模式。您的 model 是包含实际数据的模型:ArrayList<ArrayList<String>>view 是进行格式化的模型,以各种方式呈现数据。这就是 Formatting 类。

    【讨论】:

      【解决方案3】:

      您可以添加类似于标准 toString() 方法的方法,例如toArrayString() 将对象格式化为 {1,2,3,4} 或 toIntervalString() 将其格式化为 (1-4) ...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-08
        • 2014-02-19
        • 1970-01-01
        • 2016-07-07
        • 1970-01-01
        • 2012-10-29
        • 1970-01-01
        相关资源
        最近更新 更多