[an error occurred while processing this directive] IT • archiv :: Print

IT • archiv


[an error occurred while processing this directive]

[an error occurred while processing this directive]

Учим Java по методике Бэна Франклена

[an error occurred while processing this directive](none) [an error occurred while processing this directive](none)[an error occurred while processing this directive] ::
[an error occurred while processing this directive](none)
[an error occurred while processing this directive]([an error occurred while processing this directive] Роберт Нильсен [an error occurred while processing this directive])

[an error occurred while processing this directive](none)

Учимся писать Java-код, используя технологии Франклина.

Learning Techniques
PDF versionPDF версия
Обзор
Несмотря на то, что Бэнджамин Франклин не написал ни одной строчки Java кода, его методика по написанию литературных произведений могла бы быть полезна применительно к составлению Java программ. Каждый кто, по крайней мере, владеет основами Java, может использовать эту методику. Эта статья показывает, как, владея методикой Франклина, улучшить качество Java-программ. (2000 слов)

В своей автобиографии (см. ссылку в источниках), Бэн Франклин описывает, как он работал над повышением качества своих литературных произведений. Для того чтобы текст, с которым работал Франклин, выглядел идеальным, он делал короткие вставки для каждого предложения, отражающие основной смысл (он называл их “подсказками”; по тексту автор использует термин – “заметки”), откладывал потом на несколько дней этот текст, и затем, пытался восстановить оригинал по этим коротким подсказкам. Потом он сравнивал то, что получилось с оригиналом, корректируя в тех местах, где было бы возможным написать короче, что в итоге лишь повышало качество оригинала.

Люди, изучающие Java, могут попробовать сделать то же самое: определите для себя модель Java-программы, коротко опишите каждую строчку или секцию, записывая короткие заметки на полях, после отложите подальше все на несколько дней, а затем попытайтесь воссоздать оригинал программы по этим заметкам. Когда созданная версия будет готова, сравните ее с оригинальной и внесите изменения, где это необходимо; возможно вы откроете новые возможности в Вашей программе или что-то улучшите. В данной статье я приведу несколько упражнений по применению техники Франклина применительно к Java.

Упражнение 1: Используем заметки

Рассмотрите следующую демонстрационную программу, которая создает файл и записывает три строчки текста в этот файл:

import java.io.*;

 public class WriteTest2 {
 public static void main(String[] args) {
 try {
 FileWriter fw = new FileWriter("test.txt");
 BufferedWriter bw = new BufferedWriter(fw);
 PrintWriter pw = new PrintWriter(bw);
 pw.println("This is a test");
 pw.println("This is only a test");
 pw.println("In the event of a real emergency it would be too late");
 pw.close();
 bw.close();
 fw.close();
 }
 catch (Exception e) {
 System.out.println(e.toString());
 }
 }
 }

Вот один из способов использования заметок:

Main()

Try

Объект FileWriter

BufferedWriter объект

PrintWriter объект

Записать в файл текст шутки

Закрыть FileWriter объект

Закрыть BufferedWriter объект

Закрыть PrintWriter объект

Catch

Теперь отложите Ваши заметки и оригинал программы подальше на несколько дней, а после попытайтесь воссоздать текст программы по Вашим коротким заметкам. Затем сравните обе версии программы, если Вы обнаружите недостатки в Вашей версии, сделайте дополнения. Теперь Вы даже можете испытать чувство удовлетворения от того, что Ваша программа стала еще более совершенной.

Представленный код программы, также как и другие примеры в данной статье – относительно просты, поэтому Вы также можете использовать эту технику и применительно к более сложным программам. Я выбрал относительно легкий код программ для того, чтобы люди с разными уровнями владения Java могли довольно быстро применять данную технику. Однако и специалисты более высокого уровня могут взять на вооружения эту методику для написания комплексных программ на Java.

Упражнение 2: Заметки, составленные случайным образом

Франклин также придумывал и более сложные упражнения: так, например, вместо того, чтобы делать свои заметки строго по порядку, он записывал их произвольно. Как и в предыдущем упражнении, он затем откладывал свои заметки на несколько дней, а потом пытался восстановить оригинал текста по рассортированным заметкам. Точно таким же способом, Вы можете составить некоторые заметки по тексту программы Java в произвольном порядке, так чтобы в последствии их воссоздать. Для примера, Вы можете попытаться воссоздать вышеописанную программу по случайно составленному списку заметок.

PrintWriter объект

Catch

Закрыть BufferedWriter объект

Объект FileWriter

Записать в файл текст шутки

Закрыть PrintWriter объект

Main()

BufferedWriter объект

Закрыть FileWriter объект

Try

Следующая программа, которая открывает файл, создает новый файл и случайным образом вставляет в него строчки из оригинального файла, поможет Вам создать заметки в произвольном порядке. Программа должна быть запущена из командной строки “Scrambler file1.ext file2.ext”. Здесь file1.ext – оригинальный файл, а file2.ext – произвольный файл. Если файл для записи уже создан, то он должен быть перезаписан без каких-либо предупреждений, так что будьте внимательны при выборе имени файла.

import java.io.*;
 import java.util.*;

 public class Scrambler {
 public static void main(String[] args) {

 if (args.length < 2) {
 System.out.println("Must have two arguments in the form of:");
 System.out.println("Scrambler file1.ext file2.ext");
 }
 else {
 String inputFile = args[0];
 String outputFile = args[1];
 Scrambler sc = new Scrambler();
 sc.scramble(inputFile, outputFile);
 }
 }

 public void scramble(String input, String output) {
 try {
 FileReader fr = new FileReader(input);
 BufferedReader br = new BufferedReader(fr);
 PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(output)));
 List list = new ArrayList();
 String text;
 text = br.readLine();
 while (text != null) {
 list.add(text);
 text = br.readLine();
 }
 fr.close();
 br.close();
 int x = list.size();
 Collections.shuffle(list);
 for ( int I = 0 ; I < x ; I++) {
 String s = (String) list.get(I);
 System.out.println(s);
 pw.println(s);
 }
 pw.close();
 }
 catch(Exception e) {
 System.out.println(e.toString());
 }
 }
 }

Если Вы поняли общий смысл программы, то наверняка Вы захотите составить список заметок для Вашего собственного задания на Java.

Трансформированные упражнения

Сущность другого метода, который использовал Франклин, состояла в том, чтобы изменить исходный текст стиха (применительно к поэзии), отложить его на несколько дней, а затем вернуть текст стиха в первоначальный вид. Вы можете выполнить такое же упражнение на Java, например, Вы можете:

Упражнение 3: Объединение объявлений

Позвольте представить Вам следующий пример. Когда Вы создаете программы, использующие потоки ввода/вывода, Вы можете создать отдельные объекты, которые работают так, как показано на следующем листинге:

FileWriter fw = new FileWriter("test.txt"); BufferedWriter bw = new BufferedWriter(fw); PrintWriter pw = new PrintWriter(bw);

Однако, Вы также можете объединить эти объявления в одну строчку. Далее представлен код, который демонстрирует эту возможность применительно к вышеуказанной секции программы.

import java.io.*;

 public class WriteTest {
 public static void main(String[] args) {
 try {
 PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter("test2.txt")));
 pw.println("This is a test");
 pw.println("This is only a test");
 pw.println("In the event of a real emergency it would be too late");
 pw.close();
 }
 catch (Exception e) {
 System.out.println(e.toString());
 }
 }
 }

Упражнение 4: Writer и OutputStream

В другом упражнение Вам необходимо изменить программу, использующую модель Writer, на аналогичную, только с использованием OutputStream модели, так, чтобы результат работы программы остался прежним. Затем опять отложить код программы на несколько дней, после чего, вернувшись к нему, вернуть первоначальный вид программы, используя Writer модель. Применительно к версии программы, которая была рассмотрена выше, вы можете составить следующий код:

import java.io.*;

 public class WriteTest {
 public static void main(String[] args) {
 try {
 DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new
 FileOutputStream("test3.txt")));
 dos.writeBytes("This is a test\r\n");
 dos.writeBytes("This is only a test\r\n");
 dos.writeBytes("In the event of a real emergency
  it would be too late\r\n");
 dos.close();
 }
 catch (Exception e) {
 System.out.println(e.toString());
 }
 }
 }

Отложите созданный код на несколько дней, а затем вернитесь к нему, переписав его в первоначальном варианте для Writer модели.

Упражнение 5: Расширение класса Thread против наследования интерфейса Runnable

Когда работаете с потоками, Вы можете расширить класс Thread или наследовать интерфейс Runnable. Поэтому, в качестве задания, Вы можете трансформировать программу, которая расширяет класс Thread, в программу, наследующую интерфейс Runnable, и наоборот. Ниже представлена простая программа, которая расширяет класс Thread и использует счетчик от 5 до 0 с паузами в одну секунду между каждым проходом:

public class ThreadDemo extends Thread {
 public static void main(String[] args) {
 ThreadDemo t = new ThreadDemo();
 t.start();
 }

 public void run() {
 for ( int i = 5 ; i > -1 ; i--) {
 System.out.println(i);
 try {
 sleep(1000);
 }
 catch(InterruptedException e) {
 System.out.println(e.toString());
 }
 }
 }
 }

А вот пример измененной программы, которая использует наследование интерфейса Runnable:

public class ThreadDemo2 implements Runnable {
 public static void main(String[] args) {
 ThreadDemo2 td = new ThreadDemo2();
 Thread t = new Thread(td);
 t.start();
 }

 public void run() {
 for ( int I = 5 ; I > -1 ; I--) {
 System.out.println(I);
 try {
 Thread.sleep(1000);
 }
 catch(InterruptedException e) {
 System.out.println(e.toString());
 }
 }
 }
 }

Так же как и для предыдущего упражнения, отложите код программы на несколько дней, а затем вернитесь к нему, переписав его для варианта, расширяющего класс Thread.

Упражнение 6: Апплеты и приложения

Рассмотрим более трудное упражнение, когда Вам надо переписать Ваши апплеты в приложения и потом вернуть их в первоначальный вид. Рассмотрите следующий апплет:

import java.applet.*;
 import java.awt.*;

 public class AppletDemo extends Applet {
 Button button1 = new Button("Button 1");
 Button button2 = new Button("Button 2");

 public void init() {
 add(button1);
 add(button2);
 }
 }

Чтобы посмотреть этот апплет на своей машине, я использовал следующий HTML код:

<HTML>
 <BODY>
 <APPLET CODE = "AppletDemo.class" 
 WIDTH=400 HEIGHT=300> </APPLET>
 </BODY>
 </HTML>

Трансформация апплета в приложения требует нескольких изменений. В примере, показанном ниже, я расширил класс Frame, изменив менеджера размещения для Frame на FlowLayout, добавил метод main() и создал внутренний класс, для обработки процесса закрытия окна. Очевидно, что существуют и другие варианты изменения данного апплета на приложение, поэтому данный пример не претендует на единственно верное решение.

import java.awt.*;
 import java.awt.event.*;

 public class ApplicationDemo extends Frame {
 Button button1 = new Button("Button 1");
 Button button2 = new Button("Button 2");

 public void init() {
 setLayout(new FlowLayout());
 add(button1);
 add(button2);
 }

 public static void main(String[] args) {
 ApplicationDemo ad = new ApplicationDemo();
 ad.setSize(400, 300);
 ad.addWindowListener(ad.new WindowClosingListener());
 ad.init();
 ad.setVisible(true);
 }

 class WindowClosingListener extends WindowAdapter {
 public void windowClosing(WindowEvent e) {
 System.exit(0);
 }
 }
 }

Другие упражнения по трансформации

Это далеко не полный список упражнений, которые Вы можете использовать. Java – такой разнообразный язык программирования, что всегда существует более одного способа решить конкретную задачу. Сопутствующие обстоятельства будут обычно формировать вид Вашего упражнения.

Интересно, что SCDJ 2 экзамен (см. ссылку в источниках) предлагает различные стратегии для достижения подобных результатов: RMI или сериализация, выбор структуры данных (таких как массивы, Vector или HashMap), выбор менеджера размещения (или отсутствие менеджера размещения), и так далее. И нельзя думать, что лишь одна стратегия хороша, а остальные плохие; в основном, каждая стратегия имеет свои преимущества и недостатки. Экзамен требует от экзаменующего знание различных стратегий. Задания от Франклина с трансформацией применимы к другим альтернативным стратегиям, и каждый, кто попытается выполнить данные задания, найдет их очень полезными.

Выводы

Выполняя данные упражнения человек должен вкладывать в них частичку здравого смысла. Когда Бэн Франклин использовал свои упражнения для повышения качества письма, он был довольно опытным оратором и писателем. Точно также, эти упражнения могут быть полезны и для тех людей, кто читает Java – программы и тех, кто составляет их.

Перед тем как сказать, что программа готова, откомпилируйте ее. Если компилятор выдаст ошибку, значит — Вы что-то сделали не так! Иногда может быть полезным – компилировать программы после того, как Вы ее преобразовали или вернули ее в первоначальное состояние. Печально, когда программы изначально содержат ошибки, тогда нет причин трансформировать их, так как их оригинал недееспособен.

В заключении, это может показаться кому-то странным, но Франклин начал применять свои упражнения после того, как кто-то указал на его некоторые неточности в его записях. Наверное, будет очень неприятно, когда кто-нибудь Вам укажет на промахи в Ваших программах на Java, но если это все-таки произойдет, то это только послужит мотивацией для того, что сделал Франклин и для того, чтобы улучшить Ваши навыки.

Заключение

Бэн Франклин использовал свою технику для того, чтобы повысить качество литературных текстов, которые он писал. Его автобиография, например, считается классикой литературы. Точно также, Вы можете адоптировать его методику и говоря другими словами, стать более качественным программистом на Java.

Об авторе

Роберт Нильсен – сертифицированный Java 2 программист. Он получил диплом по компьютерной специальности и преподавал в течении нескольких лет. Он также является автором нескольких публикаций на компьютерные темы в различных журналах.

Ресурсы

Also by Robert Nielsen:

Reprinted with permission from the February 2001 edition of JavaWorld magazine. Copyright © ITworld.com, Inc., an IDG Communications company. View the original article at: http://www.javaworld.com/javaworld/ jw-02-2001/jw-0202-franklin.html

[an error occurred while processing this directive]
[an error occurred while processing this directive] Перевод на русский © Андрей Озеров, к.ф.м.н., программист, 2001
< Вернуться на caйт :: Copyright © 1999 — 2010, IT • archiv.