WebClub - Всероссийский Клуб Веб-разработчиков
WebClub.RU » Архив » Настройка ваших программ

Настройка ваших программ


Дата публикации: 17-03-2013

Настройка программы подразумевается сама по себе. Давайте разберемся на примере.

"Мы хотим сохранить имя (вид) шрифта вместо того, чтобы прописывать его каждый раз."

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

1. Использование интерфейса. Некоторые разработчики предпочитают иметь постоянную переменную, FONT_FACE, объявленную в интерфейсе и использовать ее везде, где требуется. Следующее приложение показывает это.

// UIConstants.java

/** Defines the UI constants. */
public interface UIConstants {
/** The font face. */
String FONT_FACE = "Courier";
}

// InterfaceDemo.java

import java.awt.*;

/** Demonstrates the use of interface to provide constants. */
public class InterfaceDemo extends Frame {

/** Initializes the demo. */
InterfaceDemo() {

// Set the frame title
super("Interface Demo");

}

/** Starts the demo. */
public void startDemo() {

String fontFace;
Font font;
Label label;

// Use the font face supplied in the interface
fontFace = UIConstants.FONT_FACE;
font = new Font(fontFace, Font.BOLD, 12);
label =
new Label(
"Change the /"UIConstants::FONT_FACE/" to use a different font.");

// Debug
System.out.println("Font Face: " + fontFace);

// Set the label's font
label.setFont(font);

// Add the label to the frame
add(label, BorderLayout.CENTER);

// Pack and show
pack();
setVisible(true);

}

/** Main. */
public static void main(String[] args) {

// Start the demo
InterfaceDemo pd = new InterfaceDemo();
pd.startDemo();

}

}
Здесь мы имеем интерфейс UIConstants и класс InterfaceDemo. Основной метод этого класса создает образец и запускает демонстрационную версию, используя startDemo(). В этом методе, мы создаем метку. Шрифт для этой метки выбирается с использованием константы FONT_FACE, которая объявлена в интерфейсе UIConstants. В конечном счете, мы добавляем ее в центр фрейма и отображаем его. С целью отладки мы печатаем font face в методе startDemo().
Теперь возвратитесь и прочитайте требования. Этот подход везде решает данную проблему. Однако, он далеко не совершенен. Он имеет, по крайней мере, 2 главных недостатка.

1. Каждый раз, когда вы изменяете font face, вам нужно перетранслировать интерфейс (это очевидно).
2. Каждый раз, когда вы компилируете интерфейс, вам нужно перетранслировать все классы, использующие этот интерфейс (есть сомнения?)

Для тех, кого все-таки интересует вопрос, почему мы должны перетранслировать все классы, которые используют интерфейс, есть ответ. Все элементы данного интерфейса - константы. Так, когда компилятор видит использование такого элемента где-нибудь в коде, он обычно непосредственно вставляет значение. Это происходит, потому что он знает, что элемент - константа, то есть, она не может изменяться. Таким образом, нет потребности иметь там переменную. В нашем случае, когда компилятор увидит использование FONT_FACE, он вставит в то место "Arial". Да, это - оптимизация.

Теперь, давайте предположим, что вы изменяете font face на "Courier" и компилируете интерфейс UIConstants (не компилируете класс InterfaceDemo). Выполните эту программу, и вы все равно увидите Font Face: Arial Перетранслируйте класс InterfaceDemo, и увидите Font Face: Courier

2. Использование класса. Ok, другой разработчик предложил: вместо интерфейса использовать класс, который имеет переменную член - FONT_FACE. Этот класс будет обеспечивать метод для возвращения значения переменной. В этом случае другие классы не будут непосредственно ссылаться на FONT_FACE. Далее показана модифицированная версия вышеупомянутого приложения, которое показывает этот подход.

// UIUtils.java

/** Provides utility methods for UI. */
public class UIUtils {
/** The font face. */
private static final String FONT_FACE = "Courier";
/** Returns the font face. */
public static String getFontFace() {
return FONT_FACE;
}
}

// ClassDemo.java

import java.awt.*;

/** Demonstrates the use of class to provide constants. */
public class ClassDemo extends Frame {

/** Initializes the demo. */
ClassDemo() {

// Set the frame title
super("Class Demo");

}

/** Starts the demo. */
public void startDemo() {

String fontFace;
Font font;
Label label;

// Use the font face supplied in the class
fontFace = UIUtils.getFontFace();
font = new Font(fontFace, Font.BOLD, 12);
label =
new Label(
"Change the /"UIUtils::FONT_FACE/" to use a different font.");

// Debug
System.out.println("Font Face: " + fontFace);

// Set the label's font
label.setFont(font);

// Add the label to the frame
add(label, BorderLayout.CENTER);

// Pack and show
pack();
setVisible(true);

}

/** Main. */
public static void main(String[] args) {

// Start the demo
ClassDemo pd = new ClassDemo();
pd.startDemo();

}

}
В этом случае, все то же самое за исключением того, что мы используем статический метод getFontFace() класса UIUtils для обеспечения font face'а.
Этот подход решает второй недостаток, упомянутый в использовании интерфейса выше - то есть вам не нужно перетранслировать все классы, использующие метод getFontFace(), даже если вы компилируете класс UIUtils. Однако, этот подход все же имеет ограничение, которое заключается в том, что каждый раз, когда вы хотите изменить font face, вы должны перетранслировать класс UIUtils. Этого практически не может быть в промышленных средах, и если вы забудете скомпилировать класс на промышленной машине, это может привести к потенциальной проблеме, которая трудно поддается отладке.

Выше мы рассмотрели общие способы настройки программ. Однако, каждый из них имеет один или несколько недостатков. Сейчас мы собираемся обсудить использование файлов свойств для облегчения процесса настройки.
Q. Что такое - файл свойств? Файл свойств позволяет вам хранить данные как ключ, пары значений. Таким образом, чтобы получить значение, вам нужен всего лишь соответствующий ключ.
Q. Как мне использовать файл свойств? Чтобы изучить это, давайте рассмотрим наши требования.

"Мы хотим сохранять имя шрифта вместо его написания в каждом месте."

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

# PropertyDemo.properties
#
# Property file for the property demo application.
#

# The font face
FontFace = Arial

# End of property file

// PropertyDemo.java

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

/** Demonstrates the use of properties. */
public class PropertyDemo extends Frame {

/** The property file. */
public static final String PROPERTY_FILE = "PropertyDemo.properties";
/** The font face property. */
public static final String FONT_FACE = "FontFace";
/** The application properties. */
Properties props;

/** Initializes the demo. */
PropertyDemo() throws IOException {

// Set the frame title
super("Property Demo");

// Read the property file
BufferedInputStream in =
new BufferedInputStream(new FileInputStream(PROPERTY_FILE));

// Update member
props = new Properties();
props.load(in);

// Close
in.close();

}

/** Starts the demo. */
public void startDemo() {

String fontFace;
Font font;
Label label;

// Use the font face supplied in the property
fontFace = (String)props.get(FONT_FACE);
font = new Font(fontFace, Font.BOLD, 12);
label =
new Label(
"Change the /"FontFace/" property to use a different font.");

// Debug
System.out.println("Face: " + fontFace);

// Set the label's font
label.setFont(font);

// Add the label to the frame
add(label, BorderLayout.CENTER);

// Pack and show
pack();
setVisible(true);

}

/** Saves to the property file. */
public void save() throws IOException {

BufferedOutputStream out;

// We are using a fixed value for the font face here.
// In a real system, this may come from a setting chosen
// by the user.
props.put(FONT_FACE, "Courier");
out = new BufferedOutputStream(new FileOutputStream(PROPERTY_FILE));

// Save the properties
props.store(out, "Automatically generated property file");

// Close
out.close();

}

/** Main. */
public static void main(String[] args) {

try {

// Start the demo
PropertyDemo pd = new PropertyDemo();
pd.startDemo();

// Check if the program was invoked with a save option
if(args.length > 0 && args[0].equals("save")) {
// Write to the property file
pd.save();
}

}
catch(Exception ex) {
ex.printStackTrace();
}

}

}
У нас есть два файла
1. "PropertyDemo.properties": файл свойств.
2. "PropertyDemo.java": Java программа.

Давайте начнем с файла свойств. Строки, начинающиеся с символа #, означают комментарии. Пары значений клавиш отделяются знаком =. Так, у нас есть только одно сохраненное свойство, FontFace, которое установлено в "Arial".
Java программа начинается с main(), который создает образец класса и запускает демонстрационную версию. В программу может также передаваться параметр - "save". Более подробно об этом скажем дальше.
Когда образец класса создан, мы читаем файл свойств. Класс java.util.Property имеет удобный метод, load(), который может непосредственно инициализировать объект свойств из входного потока. Этот объект обеспечивает метод get() для получения значения свойства данного ключа. Мы используем его, чтобы получить вид шрифта в методе startDemo() и установить шрифт метки. Метка добавляется к центру фрейма, который затем становиться видимым.
Как мы уже раньше обсуждали, эта программа может вызываться с параметром "save". В этом случае, после отображения фрейма, main() вызывает метод save(). В этом методе, мы устанавливаем свойство вида шрифта в различные значения, "Courier". Затем мы используем метод store() объекта свойств для сохранения в файл свойств. Он использует выходной поток для сохранения свойств и заголовка, который будет сохранен в начале файла.
Теперь, если вы хотите изменить шрифт, все, что вы должны сделать, открыть "PropertyDemo.java" в вашем любимом редакторе. Измените значение свойства FontFace на любое значение. Сохраните файл. В следующий раз, когда вы запустите программу, будет установлено новое значение FontFace. Таким образом, мы не должны компилировать что-либо, чтобы изменить шрифт!
Файлы свойств позволяют вам управлять настройкой ваших программ простым способом. Например, вы можете сохранять строку соединения базы данных в файле свойств. Когда вы хотите переключиться к другой базе данных, вы можете просто изменить строку в файле. Некоторые разработчики идут на один шаг вперед и выполняют динамическую регенерацию файла свойств, то есть, заново читают файл свойств во время выполнения. В этом случае нет необходимости перезапускать приложение.
Хотя, может показаться, что разработка файла свойств и его использование в программе может снизить производительность, в большинстве случаев это стоит усилий. Таким образом, в следующий раз, когда вы не захотите постоянно использовать значения, вы знаете по меньшей мере один способ, который может вам помочь

Популярное

Не так давно в сети появился новый сервис, под названием Dead Man Zero. Этот сервис сделал...
Рынок социальных площадок уже давно стал стабильным. Несмотря на то, что время от времени...
Artisteer 4 – единственный в своем роде продукт, позволяющий автоматизировать работу над созданием...
Февраль 2017 (3)
Январь 2017 (1)
Август 2016 (1)
Май 2016 (2)
Ноябрь 2015 (1)
Октябрь 2015 (1)

Карта сайта: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41

Друзья сайта

Хотите продать свой сайт?
- Мы быстро и удобно для Вас сможем его купить:
  • Заявка на продажу сайта
  • Раcсматриваем цены на каждый сайт в индивидуальном порядке.

    Случайная цитата

    Alan J. Perlis:

    "Низкоуровневый язык — это когда требуется внимание к вещам, которые никак не связаны с программами на этом языке."

    Опрос

    Как Вам новый дизайн сайта?

    Отлично
    Неплохо
    Нормальный
    Ужасно