1991年秋,在美国勒海大学亚科卡学院的一份研究报告《21世纪美国制造业的战略:一个工业主导的观点》中,首次提出了敏捷竞争的概念.而今天,我们似乎已经看到,敏捷已经在我们身边,形影不离.
作者:中国IT实验室 来源:中国IT实验室 2007年8月27日
关键字:
LoginDialog 现在能通过所有的测试。为此,他包括了符合成功登录条件的用户名和密码域。显然,这只是比第一个版本的安全性能稍微好一些。登录代码不应该包含认证的硬编码!基于这点,我们应该引入一个单独的类来包含LoginDialog 用的验证用户的登录信息。然而,这个例子是关于GUI构造的,那让我们暂停这个不安全的登录代码,继续GUI方面。
现在,我们已经建立了登录功能,并用单元测试覆盖了他,但没有可视的GUI来显示它。那下一步该做什么呢?对于已经作的和测试的实际功能,在GUI方面做的是创建和显示图像元素,然后在适当的时候调用login()方法。这个功能是普通和容易建立的,所以他不包含能中断和需要单元测试的复杂行为。因此,当建立GUI元素时,我们不需要去做测试先行的开发。例5展示了创建对话框窗口的Swing类LoginDialogView ,他的实现在LoginDialogView.java.文件。
LoginDialogView.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class LoginDialogView extends JFrame
implements ActionListener {
protected JTextField usernameField;
protected JTextField passwordField;
protected JButton loginButton;
protected JButton cancelButton;
private LoginDialog dialog;
LoginDialogView(LoginDialog dlg) {
super("Login");
setSize(300, 140);
dialog = dlg;
addControls();
loginButton.addActionListener( this );
cancelButton.addActionListener( this );
}
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
if (cmd.equals("Login")
&& dialog.login(usernameField.getText(),
passwordField.getText())) {
hide();
}
}
private void addControls() {
Container contentPane = this.getContentPane();
contentPane.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
JLabel label1 = new JLabel("Username:", Label.RIGHT);
c.insets = new Insets(2, 2, 2, 2);
c.gridx = 0;
c.gridy = 0;
contentPane.add(label1, c);
usernameField = new JTextField("", 60);
usernameField.setMinimumSize(new Dimension(180, 30));
c.gridx = 1;
contentPane.add(usernameField, c);
JLabel label2 = new JLabel("Password:", Label.RIGHT);
c.gridx = 0;
c.gridy = 1;
contentPane.add(label2, c);
passwordField = new JTextField("", 60);
passwordField.setMinimumSize(new Dimension(180, 30));
c.gridx = 1;
contentPane.add(passwordField, c);
loginButton = new JButton("Login");
c.gridx = 0;
c.gridy = 2;
contentPane.add(loginButton, c);
cancelButton = new JButton("Cancel");
c.gridx = 1;
contentPane.add(cancelButton, c);
}}
LoginDialogView 包含了文本域,标签,和按钮元素。除了普通的GUI行为外,他只是有一个简单的行为,被actionPerformed() 方法实现。这个行为就是当登录按钮被点击后,login()方法被调用。如果登录成功,对话框就被所调用的hide()方法所关闭。
为了调用login()函数,在LoginDialogView 构造器里需要接收一个LoginDialog实例。另外,他组装了完整的GUI设置和事件处理代码。大部分代码在addControls() 里,他简单的创建和排版了窗体上的GUI元素。
LoginDialogView 代码示范了一个GUI瘦视图元素怎样被设计使它只包含普通的GUI代码,而把重要的需要测试应用的行为放到一个单独,可测试的敏捷对象中。