21 октября 2009

Своё - родное. Кирилица в java

Вступление...
Хотелось ли вам когда нибудь изобрести свой язык программирования, который бы позволял всё писать на кирилице и идентификаторы, и названия процедур-функций, и команды. Что то вроде:

Цикл ( целый И = 0 ; И < КоличествоДвигателей ; И++ )
Если (НеобходмаяМощность[И] < ДоступныйРесурс[И] ) Тогда
выделитьЕщёРесурсов(НеобходмаяМощность);
И--;
Иначе
запуститьПроцессПереработки();
Конец Если;
Конец Цикл;

Скажете бред. Вовсе нет, среди множества русскоговорящих программистов около 60% владеют английским языком на уровне pre-intermediate(ниже среднего) или еще ниже. Так что код, в котором все слова были бы интуитивно понятны вероятно для них был бы роднее. Так считаю не только я.
В любимом всеми читателями этого бложка язык программирования JAVA также сделал первый шаги в эту сторону. Нет, выше приведенный сегмент кода не будет работать, он даже не скомпилируется.
Продолжение...
Но вот следующий пример красочно демонстрирует лояльность java к кирилице, и совсем уж не ясно почему на просторах интернетов столько тем с комбинациями с трёх слов: java+кирилица+проблемы.


public class Гражданин {
private String Фамилия;
private String Имя;
private String Отчество;
private String Родина;
private int Возраст;
private boolean Беспартийный;
private boolean Судимый;

public String getФамилия() {
return Фамилия;
}
public void setФамилия(String фамилия) {
Фамилия = фамилия;
}
public String getИмя() {
return Имя;
}
public void setИмя(String имя) {
Имя = имя;
}
public String getОтчество() {
return Отчество;
}
public void setОтчество(String отчество) {
Отчество = отчество;
}
public String getРодина() {
return Родина;
}
public void setРодина(String родина) {
Родина = родина;
}
public boolean isБеспартийный() {
return Беспартийный;
}
public void setБеспартийный(boolean беспартийный) {
Беспартийный = беспартийный;
}

public boolean isСудимый() {
return Судимый;
}
public void setСудимый(boolean судимый) {
Судимый = судимый;
}
public void setВозраст(int возраст) {
Возраст = возраст;
}
public String toString(){
return
(Беспартийный?"Беспартийный":"Партийный")+" гражданин "+
Фамилия+" "+Имя+" "+Отчество+
" проживающий в "+Родина+
" "+Возраст+" лет отроду"
+(Судимый?" имеет судимости":" судимостей не имеет");
}

public static void Распечатать(Object подозреваемыйОбъект){
System.out.println(подозреваемыйОбъект);
}

public static void main(String []строчка){
Гражданин петров = new Гражданин();
петров.setФамилия("Иванов");
петров.setИмя("Иполит");
петров.setОтчество("Васильевич");
петров.setРодина("КНДР");
петров.setВозраст(45);
петров.setБеспартийный(false);
петров.setБеспартийный(false);
Распечатать(петров);

}

}


И получаем следующий вывод:

d:\projects\eclipse\Test\bin>java Гражданин
Партийный гражданин Иванов Иполит Васильевич проживающий в КНДР 45 лет отроду судимостей не имеет


Как показывает пример - идентификаторы, параметры, названия методов, и даже названия классов могут состоять из кирилических символов. Единственное что остаётся для меня пока тайной - в какой версии была введена такая возможность, существовала ли она всегда. Десяти минутное насилование googla не дало ответ на этот вопрос.

P.S.: необходимо заметить что практическое применения второго примера (комбинация английских и русских слов в коде) довольно низкая, из за постоянного переключения раскладок и соответственно низкой скорости набора.

10 мая 2009

[Oracle PL/SQL] Преобразование строки в маcсив

Несколько дней назад перед мною стала интересная задача : необходимо список сокращений, представленных в виде строки через запятую, преобразовать в массив.
На ум сразу приходит самое простое но не очень эстетическое решение - написать Pl/Sql процедуру, которая будет выполнять такую задачу.


SQL> CREATE OR REPLACE FUNCTION convert_comma_to_table(p_list IN VARCHAR2)
2 RETURN test_type
3 AS
4 l_string VARCHAR2(32767) := p_list || ',';
5 l_comma_index PLS_INTEGER;
6 l_index PLS_INTEGER := 1;
7 l_tab test_type := test_type();
8 BEGIN
9 LOOP
10 l_comma_index := INSTR(l_string, ',', l_index);
11 EXIT WHEN l_comma_index = 0;
12 l_tab.EXTEND;
13 l_tab(l_tab.COUNT) := SUBSTR(l_string, l_index, l_comma_index - l_index);
14 l_index := l_comma_index + 1;
15 END LOOP;
16 RETURN l_tab;
17 END f_convert;
18 /
Довольно простая функция, которая успешно выполнит поставленную задачу.
Потратив некоторое время на поиски , я натолкнулся на вариант покрасивее. В системном пакете dbms_utility есть функция comma_to_table , которая выполняет аналогичную функциональность. Пример использования :
SQL> DECLARE
2 l_tab dbms_utility.uncl_array;
3 l_tablen number;
4 BEGIN
5 dbms_utility.comma_to_table('A,B,C', l_tablen, l_tab);
6 dbms_output.put_line('TABLE LENGTH : '|| l_tablen);
7 dbms_output.put_line('TABLE COUNT : '|| l_tab.COUNT);
8 for i in 1..l_tablen
9 loop
10 dbms_output.put_line(l_tab(i));
11 end loop;
12 END;
13 /
Замечание! На самом деле эта процедура используется для внутренних целей Oracle, поэтому имеется ряд требований к элементам будущего массива:
- это не должны быть числа, в т.ч. слова начинающиеся на цифры;
- это не должны быть зарезервированные слова;
- это не должны быть строки длиннее 30 символов.
Первые два условия я обошёл добавляя перед каждой запятой спец строку, а после преобразования удаляя её, так что в итоге удалось воспользоватся этой удобной поцедуркой из dbms_utility.

Судьба блога 2009

Уже почти год как я поменял специализацию - теперь я программирую на PL/SQL под Oracle. Так что тематика статей далее тоже немного изменится. Это не значит что я перестану писать о Java. Нет. Кровь Java девелопера всё ещё течёт в моих жилах, так что я продолжу развиватся в этом направлении. Но обстоятельства таковы, что я на данный момент прокачиваюсь в области Oracle и готов делится кое какими своими наработками.

Спасибо за внимание. Читайте с удовольствием.