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

设计应用程序和GUI之间的接口

  •  4
  • Ikke  · 技术社区  · 17 年前

    我在编程方面有相当多的经验,但在设计程序方面经验很少。 我读过设计模式和设计原则,如Solid和TDD。但我发现很难知道如何实施这些想法。

    另一种方法是定义一个事件,然后传递一个字符串或int,该字符串或int将指定应排序的标准,但随后将得到if-else语句的列表,并且不遵循开闭原则。

    你将如何设计这样一个系统。

    编辑:

    我最关心的是如何得到这个 “开-关” . 正如有人所问,数据是对象的集合。有什么方法可以很容易地添加排序标准吗?或者,这真的不可行吗?

    9 回复  |  直到 13 年前
        1
  •  2
  •   willcodejavaforfood    17 年前

    听起来确实有点像您的数据将显示在表中,如果您使用的是Swing JTable,它现在支持排序。查看 JTable tutorial 在太阳的秋千上。

    我想说,作为一个通用的解决方案,您可能会将标准作为参数传递给排序。

    另一个建议是不要太担心模式,只要保持设计简单,代码可读,就可以很好地用于小型应用程序。有时很容易陷入所有好的模式中,然后尝试将它们压缩到应用程序中。

        2
  •  2
  •   MicTech    17 年前

    如果我很理解您的问题,您需要单独的GUI和应用程序逻辑。

    看看MVC模式。 http://en.wikipedia.org/wiki/MVC

    也许MVP模式对你更好 http://en.wikipedia.org/wiki/Model_View_Presenter

    如果您有使用MVC模式的经验,请参考一些用于桌面应用程序的JavaMVC框架(主要用于web)。

        3
  •  1
  •   Zack Marrapese    17 年前

    Observer Pattern .

    有关实际实现,请参阅 this

        4
  •  1
  •   AndrewS    17 年前

    很高兴看到您正在考虑这个问题,这比不可原谅的一部分开发人员所能说的要多。

        5
  •  1
  •   Tion    17 年前

    最好的方法是“一个事件,然后传递一个字符串或int”。

    根据所使用的底层数据结构,不需要使用switch语句对数据进行排序。如果您有一个数据表,则可以使用该字符串指定排序依据的列。如果您有一个对象集合,并且列表示它们的属性,那么这就更为棘手了。在.Net中,您可以使用LINQ做一些简单的事情,让您可以通过表示为字符串的属性进行排序。但是在java中,您总是可以求助于反射来获取字段值进行排序。

    如果将数据表示为多维数组,则传递int将表示要排序的数组的property-y索引。在任何情况下,总有一种技术可以避免使用switch语句进行排序。

        6
  •  0
  •   Vinnie    17 年前

        7
  •  0
  •   Esko Luontola    17 年前

    将GUI的表示与GUI的逻辑分开。然后您可以使用TDD创建逻辑层,而表示层将只是逻辑层和GUI框架之间的简单粘合代码。

    http://martinfowler.com/eaaDev/ModelViewPresenter.html

        8
  •  0
  •   Jason S    17 年前

    看看 GlazedLists 用于对列表进行过滤/排序等操作,以及 JavaBuilders 用于在YAML文件中声明GUI元素的简单方法。(第一个几乎是必要的,第二个是方便的)

    我过去常常回避GUI开发,因为它要么很痛苦,要么我需要使用一些hokey图形工具来设计一个GUI,它以我不理解的方式工作。但是上面的工具包使用起来非常简单,并且让我将精力集中在我的程序实际上在做什么,而不是如何显示它。

        9
  •  0
  •   CaptainHastings    17 年前

    可以为每个按钮定义一个不同的事件,但是您会有几个类似的事件,唯一的目标是区分排序条件

    我实际上会使用命令模式,使用它,一个对象(通常称为Action)将封装调用方法(Action的接收者)所需的所有信息。

    大致如下:

    public enum CommandType{ 
        SORT_BY_CRITERIA_1, 
        SORT_BY_CRITERIA_2, 
        SORT_BY_CRITERIA_3; 
    }
    
    public interface Command{
         public CommandType getCommandType();
         // Any other information you need to pass to the receiver
    }
    
    public class CriteriaOneCommand implements Command{
           private final CommandType commandType;
    
           public CriteriaOneCommand(){
               commandType = SORT_BY_CRITERIA_1;
           }
    
           public CommandType getCommandType(){
               return commandType;
           }
    }
    

    接受者

    public void action(Command command){
           CommandType type = command.getCommandType();
    
           // If type is criteria 1, sort using that criteria
           // If type is criteria 2, sort using that criteria
    }
    

    即使您决定使用一个事件,也要使用enum而不是int/String来区分不同类型的事件。