rendered paste body/* 33 Îøèáêè, èëè êàê íå íàäî ïðîãðàììèðîâàòü ÍÈ-ÊÎ-ÃÄÀ! *//* (1): Èñïîëüçóåòñÿ ñàìûé ñòàðûé è ñàìûé ñòðàøíûéJava GUI Toolkit èç âñåõ êîòîðûå åñòü íà ñâåòå */import java.awt.*;/* (2): Ïëîäèòñÿ ëèøíèé êëàññ âñåãî ëèøü ñ îäíèì ìåòîäîì */public class FibArray { public static void main(String args[]) { new MenuFib("MenuFib").menu(); }}class MenuFib extends Frame { /* (3): È çà÷åì ñþäà ïåðåäàâàòü title? Ýòî ëèøíåå */ public MenuFib(String title) { super(title); } public void menu() { MenuBar menuBar = new MenuBar(); Menu data = new Menu("Data"); menuBar.add(data); /* (4): Âûíåñòè íàçâàíèÿ ïóíêòîâ ìåíþ â ìàññèâ, è ïîñëå ýòîãî äîáàâèòü èõ â öèêëå? BTW, òðîåòî÷èå ïîëàãàåòñÿ ñòàâèòü òîëüêî ïîñëå òåõ ïóíêòîâ ìåíþ, êîòîðûå ïðåäïîëîãàþò ââîä êàêîé-íèáóäü èíôîðìàöèè ïîëüçîâàòåëåì. Íàì æå áûëî ñêàçàíî, ÷òî èõ ñòàâèòü íàäî ïîñëå **ÊÀÆÄÎÃÎ** ïóíêòà ìåíþ */ data.add(new MenuItem("Input data...")); data.add(new MenuItem("-")); data.add(new MenuItem("Exit...")); setMenuBar(menuBar); /* (5):  îðèãèíàëå èñîëüçîâàëñÿ âûçîâ resize(), êîòîðûé óæå äàâíî ÿâëÿåòñÿ deprecated */ setSize(150,150); show(); } public boolean action(Event evt, Object arg) { if (evt.target instanceof MenuItem) { /* (6): Ïðîñòî êîøìàð -- èñïîëüçîâàòü îäèíàêîâûå ñòðîêè â ðàçíûõ ìåñòàõ. ßâíîå íàðóøåíèÿ ïðàâèëà DRY */ if (arg.equals("Input data...")) { new DialogFib(this, "Input Data", true).dialog(); } /* (6): Îïÿòü! Îí ñäåëàë ýòî ñíîâà! */ else if (arg.equals("Exit...")) { System.exit(0); return true; } } /* (7):  îðèãèíàëå âîçâðàùàëñÿ îáû÷íûé "false", ÷òî ÿ ñ÷èòàþ íåâåðíûì ïî ïðè÷èíå òîãî, ÷òî ðîäèòåëüñêèé êëàññ ìîã äåëàòü ÷òî-òî ïîëåçíîå â ñâîåì îáðàáîò÷èêå */ return super.action(evt, arg); } /* (8): Ýòà ôóíêöèÿ âñòðå÷àåòñÿ â ïðîãðåììå â ñîâåðøåííî íåèçìåííîì âèäå àæ ÷åòûðå ðàçà */ public boolean handleEvent(Event evt) { if (evt.id == Event.WINDOW_DESTROY) { dispose(); return true; } /* (9): Ñìîòðè ïóíêò (7) */ return super.handleEvent(evt); }}/* (10): Ñîâåðøåííî íåíóæíûé äèàëîã, êîòîðûé ñëóæèò òîëüêî äëÿ ââîäà åäèíñòâåííîãî ÷èñëà. Ëó÷øå áû äîáàâèòü ïîëå äëÿ ââîäà ÷èñëà íà ãëàâíóþ ôîðìó. */class DialogFib extends Dialog { /* Èíòóèòèâíî ïîíÿòíûå íàçâàíèÿ ïåðåìåííûõ -- çàëîã óñïåõà */ int nf; static String temp; TextField tf; /* (11): Ýòè òðè ñòðî÷êè -- àáñîëþòíî ëèøíèå è íèêîìó íå íóæíûå */ public DialogFib(Frame parent, String title, boolean isModal) { super(parent, title, isModal); } public void dialog() { /* (12): Îáúÿâëÿåì ïåðåìåííóþ, êîòîðàÿ èñïîëüçóåòñÿ òîëüêî îäíàæäû */ int m = 3; setLayout(new GridLayout(2, 1)); Panel panel = new Panel(); panel.add(new Label("Number fib")); tf = new TextField(m); tf.setText(temp); panel.add(tf); add(panel); Panel okPanel = new Panel(); okPanel.add(new Button("OK")); add(okPanel); pack(); show(); } public boolean action(Event evt, Object arg) { if (evt.target instanceof Button) { temp = tf.getText(); nf = new Integer(temp).intValue(); /* (13): Íàñëàäèòåñü ìîìåíòîì. Ýòî î÷åíü ÷óäíûé êîä. Ìû ñíà÷àëà ïðÿ÷åì ñåáÿ. Åñëè áûëî ââåäåíî ñëèøêîì áîëüøîå ÷èñëî (äëÿ êîòîðîãî ÷èñëî Ôèááîíà÷÷è íå âëåçåò â ñòàíäàðòíûé long -- îíî áûëî âû÷èñëåíî ýêñïåðèìåíòàëüíûì ïóòåì), òî ïîêàçûâàåì åùå îäèí äèàëîã ñ ñîîáùåíèåì îá îøèáêå, ïðè÷åì äëÿ ýòîãî èñïîëüçóåòñÿ íå ñòàíäàðòíûé MessageBox, à îêîøêî ñîáñòâåííîãî ïðîèçâîäñòâà */ hide(); if (nf > 92) { temp = ""; new Corr("Corr number fib").corr(); } else { /* (14): Íàâåðíîå ëó÷øå ýòîò óæàñ áóäåò ïîêàçûâàòü â ãëàâíîì îêîøêå, à íå ïëîäèòü êó÷ó îêîøåê íà ýêðàíå */ new Fib(nf).fibo(); return true; } } /* (15): Ñìîòðè ïóíêò (7) */ return super.action(evt, arg); } /* (16): ßâíîå íàðóøåíèÿ ïðàâèëà DRY */ public boolean handleEvent(Event evt) { if (evt.id == Event.WINDOW_DESTROY) { dispose(); return true; } return super.handleEvent(evt); }}/* (17): Îïÿòü ïëîäèòñÿ ëèøíÿÿ ñóùíîñòü, âìåñòî èñïîëüçîâàíèÿ ñòàíäàðòíîãî MessageBox */class Corr extends Frame { /* (18): Ýòî ëèøíåå */ public Corr(String title) { super(title); } public void corr() { Label label = new Label("Number fib < 93"); add(label); pack(); show(); /* (19): Ïîçèöèîíèðîâàíèå îêîøêà â êàêóþ-òî çàðàíåå çàäàííóþ êîîðäèíàòó. Evil, pure evil. */ move(300,0); /* (20): ß òóò ÷óòü íå ïîìåð îò óæàñà. Òóò ïðîèñõîäÿò ñëåäóþùèå íåõîðîøèøèå âåùè: 1. Íàðóøåíèå ïðàâèëà DRY 2. Ïîâòîðíî âûçûâàåòñÿ îêîøêî äëÿ ââîäà öèôåðêè. Åñëè ïîñòîÿííî ââîäèòü ñëèøêîì áîëüøèå ÷èñëà, òî ÷èñëî îêîøåê íà ýêðàíå ñòàíåò ïðîñòî îãðîìíûì */ new DialogFib(this, "Input Data", true).dialog(); } /* (21): handleEvent âîçâðàùàåòñÿ â òðåòèé ðàç! */ public boolean handleEvent(Event evt) { if (evt.id == Event.WINDOW_DESTROY) { dispose(); return true; } return super.handleEvent(evt); }}/* (22): Ïðîñòî ëèøíèé êëàññ. Õîòÿ â ïðèíöèïå åãî ñóùåñòâîâàíèå ìîæíî áûëî áû îïðàâäàòü, íàõîäèñü îí â êàêîé-íèáóäü generic áèáëèîòåêå àëãîðèòìîâ */class Fib { /* (23): Predefined ðàçìåðàì ìàññèâîâ -- ïèîíåðñêèé ïðèâåò! È îïÿòü èíòóèòèâíî ïîíÿòíûå íàçâàíèÿ ïåðåìåííûõ */ int nf; long fib[] = new long[100]; String fibs[] = new String[100]; Fib(int nf) { this.nf = nf; } public void fibo() { fib[0] = fib[1] = 1; for (int i = 0; i < nf; i++) { fib[i+2] = fib[i] + fib[i+1]; /* (24): Êîíöåïòóàëüíûé ìåòîä êîíâåðòàöèè â ñòðîêó, ÷òîáû íå ïå÷àòàòü .toString() ðó÷êàìè */ fibs[i] = "" + fib[i]; } new TableFib(fibs, nf).table(); }}/* (23): È åùå îäíî ëèøíåå îêîøêî. Ìîãó îáðàäîâàòü -- áîëüøå íîâûå êëàññû ïëîäèòüñÿ íå áóäóò */class TableFib extends Frame { /* (24): È ñíîâà èíòóèòèâíî ïîíÿòíî çà÷åì íóæíà êàæäàÿ ïåðåìåííàÿ */ String fibs[] = new String[100]; int nf; TextArea tt; /* (25): Ëèøíèå òðè ñòðî÷êè */ public TableFib(String title) { super(title); } /* (26): OMG! Âòîðîé êîíñòðóêòîð! */ public TableFib(String fibs[], int nf) { /* (27): OMG! Âûçîâ ïåðâîãî êîíñòðóêòîðà èç âòîðîãî! */ this("Fibonacci table"); this.nf = nf; /* (28): Êîïèðóåì âñå â ñåáÿ, ìàëî ëè ïðèãîäèòñÿ åùå êîãäà-íèáóäü (à ïðèãîäèòñÿ îíî òîëüêî îäèí ðàç) */ for (int i = 0; i < nf; i++) this.fibs[i] = fibs[i]; } public void table() { /* (29): Òóò ïðåäïîëàãàëîñü ÷òî íàäî âñòàâèòü íóæíîå ÷èñëî ïðîáåëîâ, ÷òîáû ïîëó÷èëñÿ êðàñèâûé ôîðìàòíûé âûâîä */ String str, Zagstr = "Number"+" Fibonacci"+"\n"; /* (30): Ìàêñèìàëüíîå ÷èñëî ñòðî÷åê çàäàåòñÿ â ÿâíîì âèäå, à íå ïîëó÷àåòñÿ àëãîðèòìè÷åñêè èëè èç êîíñòàíòû. EVIL. */ tt = new TextArea(Zagstr, 92, 30); add(tt); for (int i = 0; i < nf; i++) { /* (31): Çàìåòòüòå, ñêîëüêî ëèøíåãî êîäà òîëüêî äëÿ òîãî, ÷òîáû ó ïåðâûõ äåâÿòè ñòðî÷åê â íà÷àëå ñòîÿë íóëèê */ if (i < 9) str = "0" + (i+1) + " " + fibs[i] + "\n"; else str = (i+1) + " " + fibs[i] + "\n"; tt.append(str); } pack(); /* (32): Îïÿòü äâèãàåì íåïîíÿòíî êóäà */ move(300,0); show(); } /* (33): Íàø ñòàðûé çíàêîìûé -- handleEvent! */ public boolean handleEvent(Event evt) { if (evt.id == Event.WINDOW_DESTROY) { dispose(); return true; } return super.handleEvent(evt); }}/* Âñå, êîíåö, à êòî ñëóøàë -- ìîëîäåö. */