工作了不短时间了,代码写得还是很垃圾,经常一个类有1000+行而且是用于显示的类,但是在面板上的一些操作都是写到这个类里面(我是做SWING的,基本上所有的操作都写在Action里面,然后一些判断和赋值一写,代码就长了)心情很郁闷,觉得自己很渣,不知道有没有人和我一样的感觉,哎,希望大家能集思广益,有办法说下办法,没办法帮忙顶下,谢谢了
解决方案 »
- java 如何查看服务器的CPU使用率!!
- Java Swing怎么调用系统计算器
- 简单的JSP问题,新手盼答
- 关于JTable的回车事件
- 请各位帮我改改程序吧,我编写的程序有问题
- 请多指教get connection from datasource fail : Cannot create JDBC driver of class '' for connect URL 'null'
- 记录集合问题
- 給我一個有web應用程序線上試用版的網站,謝謝!
- 如何实现多线程中单写多读?
- 极度郁闷
- 用java实现一个自动登陆discuz论坛,然后发帖提交数据是遇到问题,请帮忙检查一下问题出在哪里
- 急求:java swing 文件上传 及下载
这是必然要的,不过有的时候,通用的内容并不好写我曾经写过一个窗口类, 太大了,后来按照功能拆分几个类去了,这个不提倡,不过也不失一个方法, <重构>可以把方法转为类,也可以把类转为方法,看代码和设计的平衡吧
1.不使用内部类
2.在Action的子类上也使用继承
最近在考虑参照Swing的MVC模式实现数据与业务逻辑、显示的分离
以一个类保存数据,公开数据改变的方法和数据改变的监听器
一个类负责界面的显示,并注册到数据类以监听到数据的改变时更新界面
一个类负责逻辑控制,对用户的按键事件、鼠标事件进行处理,并在需要的时候调用数据类的方法引发数据改变
如Swing的List类:
数据类就是DefaultListModel
界面显示类为BasicListUI
逻辑控制类是JList
你要让他们都有活干,不能闲着。
当然,他们每个人只能干、擅长某一类工作你的程序就是活,怎么安排,看你自己啦这是训练组织能力和工作分配能力。
正打算写一些这方面的文章。研究这个问题有半年多了。最近利用一个工作中用到的简单模型写了一个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) ;
}) ;
....不知这样说是否能说明白,我在本次重构告一段落后,计划在博客中详细议一下
至于你说代码的复杂性这是肯定的因为我们不能把每一件事的发生都由Switch实现因为它支持不了,所以我们无奈才选择了IF于ELSE的嵌套。所以你没有必要过于自责。