Руки устают от многословности Java? Нет сил на C++ набрать { return a; } и глаза мокреют от зависти к шарповскому сахарку => a;?
Я сейчас перевожу свою реализацию на питоне быстрого нечеткого поиска в БД с помощью
алгоритма Левенштейна и
Trie. Перевожу на PL/SQL.
PL/SQL - это такой динозавр в мире ЯП, потомок Ады. Если к IF .... THEN .... END IF; можно в конце концов привыкнуть, то вот
реализация ООП в PL/SQL это настоящий хардкор. Синтаксический сахар хотите? Синтаксический перец вам в монитор!
Вот пара классов на питоне:
class Cursor(object):
def __init__(self, node, pos, miss_count ):
assert(node is not None)
assert(miss_count>=0.0)
self.node = node
self.pos = pos
self.miss_count = miss_count
def __str__(self):
return u'node={} pos={} miss_count={}'.format(self.node.code, self.pos, self.miss_count)
class Cursors(object):
def __init__(self):
self.cursors = dict()
def add(self, cursor):
node_id = id(cursor.node)
if node_id in self.cursors:
if cursor.miss_count < self.cursors[node_id].miss_count:
self.cursors[node_id] = cursor
else:
self.cursors[node_id] = cursor
def __iter__(self):
return iter(self.cursors.values())
def is_empty(self):
return len(self.cursors)==0
А теперь текущий черновик после перевода на PL/SQL:
CREATE TYPE DUP_Cursor AS OBJECT
(
node DUP_TrieNodeType,
pos INTEGER,
miss_count INTEGER
);
CREATE TYPE DUP_CursorsList IS TABLE OF DUP_Cursor;
create or replace type DUP_Cursors as object
(
cursors DUP_CursorsList,
CONSTRUCTOR FUNCTION DUP_Cursors RETURN SELF AS RESULT,
MAP
MEMBER FUNCTION is_empty RETURN INTEGER,
MEMBER FUNCTION count_items RETURN INTEGER,
MEMBER FUNCTION get_item( i INTEGER ) RETURN DUP_Cursor,
MEMBER PROCEDURE add_item( new_cursor DUP_Cursor )
);
CREATE OR REPLACE TYPE BODY DUP_Cursors AS
CONSTRUCTOR FUNCTION DUP_Cursors RETURN SELF AS RESULT
AS
BEGIN
SELF.cursors := DUP_CursorsList();
RETURN;
END;
MAP MEMBER FUNCTION is_empty RETURN INTEGER IS
BEGIN
IF cursors.COUNT=0 THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END;
MEMBER FUNCTION count_items RETURN INTEGER IS
BEGIN
RETURN cursors.COUNT;
END;
MEMBER FUNCTION get_item( i INTEGER) RETURN DUP_Cursor IS
BEGIN
RETURN cursors(i);
END;
MEMBER PROCEDURE add_item( SELF IN OUT NOCOPY DUP_Cursors, new_cursor DUP_Cursor ) IS
i_found INTEGER;
BEGIN
i_found := -1;
FOR i in 1..cursors.COUNT LOOP
IF cursors(i).node.id = new_cursor.node.id THEN
IF cursors(i).miss_count > new_cursor.miss_count THEN
cursors(i).miss_count := new_cursor.miss_count;
END IF;
i_found := i;
EXIT;
END IF;
END LOOP;
IF i_found=-1 THEN
cursors.EXTEND;
cursors( cursors.COUNT ) := new_cursor;
END IF;
END;
END;
/
Заметили, как изящно ключевое слово MAP отделяет перечень полей и конструктор (sic!) от списка методов класса?