четверг, 24 февраля 2011 г.

Объект

В java существует набор правил умело применяя которые можно строить очень сложные объектно-ориентированные программы:
import static java.lang.System.out;
public class app
{
 public static void main(String[] args)
 {
  //создать объект можно при помощи ключевого слова 
  //new
  Human human=new Human("Jon");
  human.setFamily("Smith");
 //out.println(human.name); - ошибка доступа на этапе компиляции
  out.println(human.getName());
  out.println(human.family);// - а здесь все нормально
  out.println(human);//один из способов использования
  //унаследованного метода Object.toString();
 }
}
class Human
{
 private String name;
 //приватная переменная доступна 
 // только внутри класса у наследника
 // ее не будет!(для наследования нужно 
 // создать защищенную переменную protected
 public String getName(){return this.name;}
 //публичный метод виден из любого пакета
 public Human(String name)
 { //публичный конструктор с параметром
   this.name=name;
 }
 String family;//доступна только впределах пакета!
 public void setFamily(String family)
 {
  this.family=family;
 }
 @Override
 public String toString()
 {
  return super.toString()+";name="+name+";family="+family;
 }
}

Шаблон Цепочка ответственности

Также довольно простой в понимании шаблон.
Используется в основном для создания разнообразных
фильтров. Данные проходя через цепочку фильтров(обработчиков)
подвергаются различной модификации. Один из примеров
обработка URL, другой - обработка запросов в сервлетах.
// file: app.java
// build: javac app.java
// run: java app
 //задаем интерфейс обработчика, 
 //с возможностью задать следующего(setParent)
 interface Handler
 {
    public void setParent(Handler parent);
    public void handle(String url) throws Exception;
 }
 class FtpHandler implements Handler
 {
  private Handler parent=null;  
  @Override 
  public void setParent(Handler parent)
  {
      this.parent=parent;
  
  }
  @Override 
  public void handle(String url) throws Exception
  {
      //если объект подходящий - обрабатываем
      if(url.startsWith("ftp://"))
       System.out.println("FtpHandler resource handle success!");
      else//нет - передаем по цепочке другому обработчику
      if(parent!=null) parent.handle(url);//если цепочка прервалась
      else throw new Exception("Handler not found!");//сообщаем об этом 
      //и завершаем обработку
  }
 }
 class HttpHandler implements Handler
 {
  private Handler parent=null;  
  @Override 
  public void setParent(Handler parent)
  {
      this.parent=parent;
      
  }
  @Override 
  public void handle(String url) throws Exception
  {
      if(url.startsWith("http://"))
       System.out.println("HttpHandler resource handle success!");
      else
      if(parent!=null) parent.handle(url);
      else throw new Exception("Handler not found!");
  }
 }
 class ChainBuilder
 {
    public ChainBuilder(){}
    private Handler root=null;
    public Handler getRoot(){return root;}
    public Handler add(Handler handler)
    {
  if(root==null) root=handler;
  else           root.setParent(handler);
   return handler;
 }
 }
public class app
{
 public static void main(String[] args)
 {
    //суть паттерна цепочка ответственности
    //что мы заранее не знаем какой точно объект
    //будет подан на вход, следовательно не знаем какой
    //обработчик нам понадобиться. пример: адресная строка броузера
    ChainBuilder cb =new ChainBuilder();
    cb.add(new FtpHandler());
    cb.add(new HttpHandler());
    Handler handler=cb.getRoot();
     handle(handler,"https://narod.ru");
     handle(handler,"ftp://narod.ru");
     handle(handler,"http://narod.ru");
 }  
 public static void handle(Handler handler,String url)
 {
  try
  {
      handler.handle(url);
  }
  catch(Exception e)
  {
   //e.printStackTrace();
   System.out.println(e.getMessage());
  }
 }
}

среда, 23 февраля 2011 г.

Программа для просмотра курса валют по данным ЦБР

Программа для просмотра курса валют по данным ЦБР. Очень интересный проект. В том плане, что сервис ЦБР работает на Microsoft.Net и как следствие не дружит с java WS. Поэтому мне пришлось анализировать http-запросы, для того чтобы реализовать вручную SOAP-сообщения с параметром(на определенную дату) и вручную разбирать результат (xml).
Есть возможность распечатки курса валют за любой день.

Java-Игра Докер

Java-Игра Докер - старинная игра. Когда я учился в школе, на корветах была такая игра. Второй раз я столкнулся с ней в телевизоре. Прошел 17 из 20 уровней. Потом тв унесли в подвал. Поиск этой игры в интернете ничего не дал. В общем, я решил написать игру сам. В качестве IDE я использовал BlueJ - среда для изучения java. У меня получилось 3 объекта: кирпич, коробка и докер. В текстовом файле описывается карта и потом загружается в программе. Вообщем-то, это наверно, первый проект в котором я пытался мыслить объектно.Если есть желание - можно доработать в плане разработки набора карт, более удобное меню и сохранение результатов.

Шаблон Команда

Шаблоны программирования - это базовый инструмент для создания профессиональных программ. Знание шаблонов, пожалуй, важнее даже знания самого языка. Написание программы требует прежде всего мышления, а не знания. А шаблоны - это и есть процесс мышления предыдущего поколения программистов, обобщенный и оформленный в виде шаблонов. Команда - наиболее простой для первого знакомства шаблон. Позволяет упростить вызов любого количества действий в программе. При этом команда как бы делегирует выполнение действия другому объекту:
interface Command
{
 public void execute();
}
class ConnectCommand implements Command
{
 public void execute()
 {
   System.out.println("connect...");
 }
}
class ExitCommand implements Command
{
 public void execute()
 {
   System.out.println("exit...");
   System.exit(0);
 }
}
class app
{
 public static void main(String[] args)
 {
  Command cmd=new ConnectCommand();
          cmd.execute();
          //повторное использование уже
          //созданной команды
          cmd.execute();
          //использование единого интерфейса(унификация)
          cmd=new ExitCommand();
          cmd.execute(); 
 }
}
Используя данный шаблон в качестве основы легко организовать историю команд как например в текстовых редакторах наподобие Word или Writer с возможностью отмены.

среда, 16 февраля 2011 г.

Упаковка программы

Итак, программа написана, работает. Не очень удобно распространять свою программу ввиде кучи файлов(средний проект состоит из 10-100 классов). Не говоря уже о всевозможных ресурсах(картинки, xml и т.п.). В состав JDK входит утилита jar - упаковщик java-классов в один архивный файл. Возьмем программу из предыдущего примера:
jar -ec utils.app * > app.jar
Здесь используется два ключа: e - задать класс с main-функцией, c - создать архив. * таким образом со стандартного вывода результат работы утилиты будет записан в файл app.jar. По структуре это обычный zip-файл. Так что, в крайнем случае это можно сделать и без утилиты jar. Запустить программу из jar-файла можно двумя способами.
Первый работает, если как в этой статье была указана entry-point(точка входа в программу):
java -jar app.jar.
Второй универсальный(в том смысле что каждый класс в пакете может
содержать main-функцию, поэтому можно по разному запустить программу, в первом случае мы всегда начинаем выполнение программы из одной функции)
java -cp app.jar utils.app
просто добавляем jar-файл в переменную classpath(пути по которым загручик классов java class loader ищет нужные классы) и опять указываем путь к точке входа.

Вторая программа

Создайте каталог для своего второго проекта, в нем создаете
следующие каталоги ./src/utils и ./bin. В папке utils создайте файл
app.java:
package utils;
// - пакеты позволяют разделить
// программные модули - это еще одна
// особенность ООП
import  static java.lang.System.out;
// ООП позволяет подключать программные единицы
// находящиеся в других пакетах
//ключевое слово static
//в данном случае позволяет сократить форму
//записи использования объекта out
public class app
{
 private int a;//эту переменную можно
 // использовать только внутри класса 
 int b;//эту на уровне пакета
 public int c;//эта будет доступна 
 //из любого класса
 public static void main(String[] args)
 {
  out.println("Hello!");
 }
}

После этого откройте терминал в корневом каталоге и выполните команду:
javac -sourcepath ./src -d ./bin ./src/utils/app.java
перейдите в каталог bin и запустите программу
java utils.app.
Обратите внимание, что для запуска программы мы указываем
имя класса содержащего main-функцию вместе с именем пакета.
В противном случае java выдаст ошибку "Класс не найден!"

Первая программа

//файл app.java:
public class app
{
 //как видим для того чтобы запустить программу
 //нам необходима точка входа:
 //данный метод публичный (специфика ООП)
 // - иначе среда исполнения
 //java не увидит его и не выполнит программу!
 public static void main(String[] args)
 {
 }
}

для компиляции и запуска набираем две команды в терминале:
javac app.java
java app

Так как в коде не было ни одной инструкции программ сразу после
запуска завершит свою работу.
Попробуйте сами. Для программирования на java могу порекомендовать
сразу несколько инструментов JDK oracle 1.6(само собой разумеется),
текстовый редактор Geany и если вы очень ленивы и не хотите начинать с основ NetBeans IDE также от oracle.
Если все сделано правильно на выходе вы получаете app.class - скомпилированный байт код для виртаульной java-машины.