![]() | JavaCurry | サンプルソース |
|---|---|---|
JavaCurryの表示は、「四角」「文字」「円」の3つのクラスから構成されています。黄色い箱がBoxクラス。文字はTextクラスで、同心円はCircleクラスのインスタンスを4つ重ねたもの。ふざけているようで、じつは深い味わいのソースコード。256ノックの真骨頂っす。 |
JavaCurry.java Box.java Text.java Circle.java DrawPanel.java Parts.java |
/**
* 愛のJava256本ノック for Java 5.0
* Javaサンプルソース ver0.2C "JavaCurry"
* JavaCurry.java 「カレーのパッケージをオブジェクト指向で表現」
*
* 2005/09/23 制作:安永ノリカズ
*
* 【コンパイル&実行方法】
* >javac *.java
* >java JavaCurry
* 【キーワード】
* 大塚食品, ボンカレーゴールド
* 【試してみよう】
* Box、Circle、Textを上手く組み合わせ、右下にJASマークを入れる。
* http://www.jasnet.or.jp/
*/
import java.awt.Color;
import java.lang.String;
import java.lang.System;
import javax.swing.JFrame;
public class JavaCurry extends JFrame {
public JavaCurry() {
add(new DrawPanel());
}
public static void main(String[] A00) {
JFrame L00 = new JavaCurry();
L00.setTitle("オブジェクト指向レトルトカレー");
L00.setDefaultCloseOperation(EXIT_ON_CLOSE);
L00.setBackground(Color.white);
L00.pack();
L00.setResizable(false);
L00.setVisible(true);
}
}
/* ■ クラスの外でちょっと一言 ■
本当は、ハウス『ジャワカレー』のパッケージをやりたかったんですが、かなり
複雑で、とてもプリミティブな図形の組み合わせでは表現不可能なため、断腸の
思いで、大塚食品『ボンカレー ゴールド』を題材にしました。
レトルトカレーマニアにつっこまれる前に、言い訳しておきます。
*/
/**
* 愛のJava256本ノック for Java 5.0
* Javaサンプルソース ver0.2C "JavaCurry"
* Box.java 「カレーのパッケージをオブジェクト指向で表現」
*
* 2005/09/23 制作:安永ノリカズ
*
* 【コンパイル&実行方法】
* >javac *.java
* >java JavaCurry
* 【キーワード】
* 矩形(rectangle)の描画
* 【試してみよう】
* JavaCurry.java参照
*/
import java.awt.Color;
import java.awt.Graphics;
public class Box implements Parts {
int I00;
int I01;
int I02;
int I03;
Color I04;
Box(int A00, int A01, int A02, int A03, Color A04) {
this.I00 = A00;
this.I01 = A01;
this.I02 = A02;
this.I03 = A03;
this.I04 = A04;
}
public void M00(Graphics A00) {
A00.setColor(I04);
A00.fillRect(I00, I01, I02, I03);
}
}
/* ■ クラスの外でちょっと一言 ■
ちなみに、僕は辛いのは苦手な方です。というか、すごく汗をかいてしまいま
す。「ココイチ」のカレーでいえば、辛さ普通で結構汗だく。でも、好きなん
で、ちょくちょく食べに行ってます。よく注文するのは「チキンカツカレー」で
すね。
*/
/**
* 愛のJava256本ノック for Java 5.0
* Javaサンプルソース ver0.2C "JavaCurry"
* Text.java 「カレーのパッケージをオブジェクト指向で表現」
*
* 2005/09/23 制作:安永ノリカズ
*
* 【コンパイル&実行方法】
* >javac *.java
* >java JavaCurry
* 【キーワード】
* 論理(logical)フォントと物理(physical)フォント
* 【試してみよう】
* JavaCurry.java参照
*/
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.lang.String;
public class Text implements Parts {
String I00;
int I01;
int I02;
Color I03;
int I04;
Text(String A00, int A01, int A02, Color A03, int A04) {
this.I00 = A00;
this.I01 = A01;
this.I02 = A02;
this.I03 = A03;
this.I04 = A04;
}
public void M00(Graphics A00) {
A00.setColor(I03);
A00.setFont(new Font("SansSerif", Font.BOLD, I04));
A00.drawString(I00, I01, I02);
}
}
/* ■ クラスの外でちょっと一言 ■
福岡ローカルの話になって申し訳ないんですが、天神西通りのケンタッキーの上
に、「ツナパハ」というカレー屋さんがあります。そこの「ドライカリー」は
(少なくとも自分にとっては)かなり辛いんですが、とっても美味しいです。デ
ジハリ福岡校が大名にあった頃、ランチでよく食べましたね。
その店に、辛さの指定で「デビルレッド」という項目があります。いかにも辛そ
うな名前で、実際にすごく辛いです。あと、昔、親不孝通りにあった「タージ」
という店には「青酸カリー」というメニューがありました。死ぬほど辛いんで
しょうね。で、これも今はなくなった店ですが、天神ビル地下の「サムソン」に
は、「W死に辛」という辛さ指定がありました。もちろん、どれも食べたことは
ありません。
*/
/**
* 愛のJava256本ノック for Java 5.0
* Javaサンプルソース ver0.2C "JavaCurry"
* Circle.java 「カレーのパッケージをオブジェクト指向で表現」
*
* 2005/09/23 制作:安永ノリカズ
*
* 【コンパイル&実行方法】
* >javac *.java
* >java JavaCurry
* 【キーワード】
* 楕円(oval)の描画
* 【試してみよう】
* JavaCurry.java参照。
*/
import java.awt.Color;
import java.awt.Graphics;
public class Circle implements Parts {
int I00;
int I01;
int I02;
Color I03;
Circle(int A00, int A01, int A02, Color A03) {
this.I00 = A00;
this.I01 = A01;
this.I02 = A02;
this.I03 = A03;
}
public void M00(Graphics A00) {
A00.setColor(I03);
A00.fillOval(I00, I01, I02, I02);
}
}
/* ■ クラスの外でちょっと一言 ■
このサンプルを作るにあたり、「ボンカレーのパッケージってどんなんだっ
け?」ということで、早速、近所のスーパー(ゆめタウン宗像店)へ調査に行き
ました。しかし、僕の記憶にある『ボンカレー ゴールド』はもうそこにはな
く、『ボンカレー ゴールド21』へとバージョンアップしてるではないです
か! しかも、パッケージの「丸」が、微妙に立体的で、テカリまで入ってる
じゃないですか!
とりあえず見なかったことにして、スーパーを後にしました……。
*/
/**
* 愛のJava256本ノック for Java 5.0
* Javaサンプルソース ver0.2C "JavaCurry"
* DrawPanel.java 「カレーのパッケージをオブジェクト指向で表現」
*
* 2005/09/23 制作:安永ノリカズ
*
* 【コンパイル&実行方法】
* >javac *.java
* >java JavaCurry
* 【キーワード】
* アンチエイリアス(antialias)
* 【試してみよう】
* JavaCurry.java参照。
*/
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JPanel;
import static java.awt.RenderingHints.KEY_ANTIALIASING;
import static java.awt.RenderingHints.VALUE_ANTIALIAS_ON;
public class DrawPanel extends JPanel {
static final int C00 = 280;
static final int C01 = 360;
static final Color C02 = new Color(170, 0, 0);
static final Color C03 = new Color(250, 190, 20);
static final Color C04 = new Color(240, 30, 0);
static final Color C05 = new Color(240, 70, 0);
List<Parts> I00;
public DrawPanel() {
setBackground(Color.white);
setPreferredSize(new Dimension(C00, C01));
I00 = new ArrayList<Parts>();
I00.add(new Box(10, 10, 260, 340, C03));
I00.add(new Text("ジャバカレー", 25, 62, C02, 36));
I00.add(new Text("JAVA CURRY GOLD ゴールド", 30, 84, C02, 16));
I00.add(new Text("辛さ256倍", 176, 100, Color.red, 16));
I00.add(new Text("200g・1人分", 25, 330, Color.black, 10));
I00.add(new Circle(30, 105, 220, C02));
I00.add(new Circle(60, 135, 160, C04));
I00.add(new Circle(80, 155, 120, C05));
I00.add(new Circle(100, 175, 80, C03));
}
public void paintComponent(Graphics A00) {
super.paintComponent(A00);
Graphics2D L00 = (Graphics2D)A00;
L00.setRenderingHint(KEY_ANTIALIASING, VALUE_ANTIALIAS_ON);
for (Parts L01 : I00) {
L01.M00(L00);
}
}
}
/* ■ クラスの外でちょっと一言 ■
「Javaカレーゴールド」の表示は、「四角」「文字」「円」の3種類のパーツを
組み合わせて実現しています。表示されている文字は、すべてTextクラスのイン
スタンスで、同心円は、Circleクラスのインスタンスを4つ重ねたものです。
そんな具合に、違うクラスから派生したインスタンスですが、最終的にはどれも
Parts型として一括管理されています。これは、Box, Text, Circleそれぞれのク
ラスがPartsインターフェースを実装しているからこそなせるわざ。別々のクラ
スでも、共通要素をインターフェースに抽出することで「同じ種類もの」として
管理することが出来ます。
とにかく、オブジェクト指向を理解してもらうのに、こんなサンプル作るのは、
自分くらいのもんだろうと、つくづく(でもちょっぴり誇りに)思っています。
何年か後に「JavaCurryでオブジェクト指向の意味を理解しました」というプロ
グラマが現れることを、心より願ってやみません。
*/
/**
* 愛のJava256本ノック for Java 5.0
* Javaサンプルソース ver0.2C "JavaCurry"
* Parts.java 「カレーのパッケージをオブジェクト指向で表現」
*
* 2005/09/23 制作:安永ノリカズ
*
* 【コンパイル&実行方法】
* >javac *.java
* >java JavaCurry
* 【キーワード】
* インターフェース(interface)
* 【試してみよう】
* JavaCurry.java参照。
*/
import java.awt.Graphics;
public interface Parts {
public void M00(Graphics A00);
}
/* ■ クラスの外でちょっと一言 ■
インターフェースとは、クラスの「振る舞い方」のみを定義するものです。この
Partsインターフェースは、「Graphicsオブジェクトを受け取って、描画する」
という動作を定義していますので、M00には「いかにも描画しそう」な名前をつ
けてあげてください。
具体的にどのように描画するかは、このインターフェースを実装している、Box,
Circle, Textの各クラスでそれぞれ記述してます。
JavaCurryでは、このPartsインターフェースが、ピリッと効いたスパイスになっ
てますので、DrawPanel.javaにて、このインターフェースがどのように利用され
てるのか、その風味をじっくりご賞味ください。
*/