工作了不短时间了,代码写得还是很垃圾,经常一个类有1000+行而且是用于显示的类,但是在面板上的一些操作都是写到这个类里面(我是做SWING的,基本上所有的操作都写在Action里面,然后一些判断和赋值一写,代码就长了)心情很郁闷,觉得自己很渣,不知道有没有人和我一样的感觉,哎,希望大家能集思广益,有办法说下办法,没办法帮忙顶下,谢谢了

解决方案 »

  1.   


    这是必然要的,不过有的时候,通用的内容并不好写我曾经写过一个窗口类, 太大了,后来按照功能拆分几个类去了,这个不提倡,不过也不失一个方法,  <重构>可以把方法转为类,也可以把类转为方法,看代码和设计的平衡吧
      

  2.   

    谢谢各位,分已经加上去了,估计还要加一次...设计模式  重构都可以,但是那基本是要等代码都成型了再拆...希望大家能推荐几本书.阎宏的<设计模式>和<重构>都有...  换其它的吧
      

  3.   

     <重构>可以把方法转为类,也可以把类转为方法,看代码和设计的平衡吧
      

  4.   

    看看head first 设计模式
      

  5.   

    两点:
          1.不使用内部类
           2.在Action的子类上也使用继承
      

  6.   

    21楼能说具体点吗?因为我是做swing的,所以一个界面里面的Action一般都只处理这个类里面的业务所以没有很多能抽象出来的东西,如果按照比例计算的话,估计显示最多4成,而控制(Action)最少要占6成。可能最好的办法,也就是17楼的把Action独立出来了
      

  7.   

    我之前编码也是只求实现功能
    最近在考虑参照Swing的MVC模式实现数据与业务逻辑、显示的分离
    以一个类保存数据,公开数据改变的方法和数据改变的监听器
    一个类负责界面的显示,并注册到数据类以监听到数据的改变时更新界面
    一个类负责逻辑控制,对用户的按键事件、鼠标事件进行处理,并在需要的时候调用数据类的方法引发数据改变
    如Swing的List类:
    数据类就是DefaultListModel
    界面显示类为BasicListUI
    逻辑控制类是JList
      

  8.   

    构建 GUI 的代码过千行正常,但最好把业务逻辑的代码与 GUI 事件处理分开,否则代码会很难维护。
      

  9.   

    可以看看<重构>的书了。其实你理解成你在带领10个人的团队
    你要让他们都有活干,不能闲着。
    当然,他们每个人只能干、擅长某一类工作你的程序就是活,怎么安排,看你自己啦这是训练组织能力和工作分配能力。
      

  10.   


    正打算写一些这方面的文章。研究这个问题有半年多了。最近利用一个工作中用到的简单模型写了一个swing的GUI,为了探索解决遇到的与楼主相同的问题,我在用1周实现了基本功能后,又用2个多月的时间先后四五次重构代码(主要使用eclipse),有些心得摘要如下:1、按照业务模型设计数据结构(model),单独形成java文件;
    2、根据对数据结构的展示要求设计视图(view),视图中的需要动态填入内容的控件全部声明为public final字段,并在够在函数中初始化为缺省值,视图中仅包括数据展示(设计swing构建的model,如ListModel、TableModel等),以及页面布局,不包含任何数据操作,如果视图较为复杂,则按照视图界面进行分解,经过努力,我已经将一个应用的视图转化为7-8个独立的java文件,每个文件都在200行以下;
    3、根据业务模型设计一个或多个控制器(controller)类,controller的构造器以上述视图的总类为参数,在这个控制器中设定各个控件之间的互操作,以及对数据进行处理,并通知视图展现改变了的数据。这个类可以包含很多方法(如20-30个公用方法,接近100个私有方法),2000行也没关系,但是这个类中的方法以上述视图类为索引,像是字典一样,各个方法均较为独立,可以很容易的拆成更小的java文件(不过拆了以后可能更不利于阅读)例如:我范例中的一个业务模式如下,初始窗口左边为索引index(一个JTable),右边为一个记录列表recs(一个JTable),用户在左边的index里面选择索引项时,在右边的recs显示索引项下的记录,选择recs中的记录时,在一个info(JTextArea)控件中显示特定记录的详细信息。实现如下:class taskman_view
       -   index = new index_view() 
                private final AbstractTableModel model = ...
                public final JTable table = new JTable(model) ...   -   recs = new recs_view()
                private final AbstractTableModel model = ...
                public final JTable table = new JTable(model) ...   -   act = new edit_act(this) 
                private final taskman_view man ; 
                edit_act(taskman_view aman) {
                    this.man = aman ;
                    man.index.table.getListSelectionModel(
                    new ListSelectionModel(ListSelectionEvent e) { 
                       int [] rows = man.index.table.getSelectedRows() ;
                       List<rec_def> rec_list = man.index.get_recs(rows) ;
                       man.index.recs.setData(rec_list) ;
                    }) ;
                ....不知这样说是否能说明白,我在本次重构告一段落后,计划在博客中详细议一下
      
      

  11.   

    其实在你做的东西多了以后你完全可以把大体上都有的一个界面拿出来包装成一个自己的类包,到时侯拿出来应该会省心的多。
    至于你说代码的复杂性这是肯定的因为我们不能把每一件事的发生都由Switch实现因为它支持不了,所以我们无奈才选择了IF于ELSE的嵌套。所以你没有必要过于自责。
      

  12.   

    既然楼主是用swing开发的,建议楼主了解一下MVC模式,然后再学习一下其他的设计模式,好好捉摸捉摸,会有很大收获的。
      

  13.   

    优秀的程序是经验的总结,建议你先看优秀的开源代码,学习别人的编程风格。比如JDK就是开源的,当然,了解JDK源码需要有扎实的语法基础,如果要看,也先看lang包和util包,因为依赖关系较少。需要注意的是,不要被类中莫名的方法调用吓到而影响你对这个类的理解,对于莫名的方法,只需要查看他的API的意思就行了,或者根据它的英文命名来判断。在看源码的时候最好使用eclipse的快捷键,ctrl+左键进入方法,ctr+t和F4查看继承结构,用来找到实现类不只是JDK,开源的东西很多个人不建议你看直接根据设计模式来编码,设计模式是一种经验的积累,随随便便去套用设计模式是不好的。