Swingで変数数縛りプレイ
コードを読みやすくするにはどうしたら良いか?
この疑問に対する答えについて、最近の僕のスタンスは
「頭のワーキングメモリ(レジスタの本数)を使わなくて済むコード」
だと考えるようになっている。*1
ワーキングメモリ削減を実現するサブミッションとして、
「分かりやすい変数名にしましょう」とか
「変数のスコープは出来るだけ狭くしましょう」とか
「変数を出来るだけ減らしましょう」といったアプローチが
どんな言語でも取り組みやすい対策だと思う。
そんなわけで最近は変数削減史上主義に走っている僕ですが、
GUI絡みのコードはどうしても変数数が多くなってしまいがちだった。
そこで無理やり削ってみたらどこまで減らせるかチャレンジしてみたくなった。
以下はID/PASS/ボタンの3点セットのよくあるログインフォーム
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class NonUseVariant { public static void main(String[] args) { new JFrame(){ public void $() { setTitle("変数削減縛りプレイ"); setBounds(100, 100, 320, 120); setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS)); add(new JPanel(){ public JPanel $() { setLayout(new BorderLayout()); add(new JLabel("UserName"), BorderLayout.WEST); add(new JTextField(), BorderLayout.CENTER); return this; } }.$()); add(new JPanel(){ public JPanel $() { setLayout(new BorderLayout()); add(new JLabel("Password"), BorderLayout.WEST); add(new JPasswordField(), BorderLayout.CENTER); return this; } }.$()); add(new JButton("ログイン"){ public JButton $(){ if(getActionListeners().length >= 1) return this; addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println( ((JTextField)((JPanel)$().getParent(). getComponent(0)).getComponent(1)).getText() ); } }); return this; } }.$()); setDefaultCloseOperation(EXIT_ON_CLOSE); this.setVisible(true); } }.$(); } }
どうしてもないと困る2つ(mainメソッドの引数とActionListener#actionPerformedをオーバーライドしたときの引数)以外は削減することができた。保守性や見た目は犠牲になりました。
*1:テストしやすいコードや、変更・保守に強いコードはまた別のスタンスがあるが