Что лучший способ состоит в том, чтобы представить hierachy в базе данных SQL? Универсальная, портативная техника?
Позволяют нам предположить, что hierachy главным образом читается, но не абсолютно статичен. Скажем, это - родословная.
Вот то, как не сделать это:
create table person (
person_id integer autoincrement primary key,
name varchar(255) not null,
dob date,
mother integer,
father integer
);
И вставка данных как это:
person_id name dob mother father
1 Pops 1900/1/1 null null
2 Grandma 1903/2/4 null null
3 Dad 1925/4/2 2 1
4 Uncle Kev 1927/3/3 2 1
5 Cuz Dave 1953/7/8 null 4
6 Billy 1954/8/1 null 3
Вместо этого разделяет Ваши узлы и Ваши отношения в две таблицы.
create table person (
person_id integer autoincrement primary key,
name varchar(255) not null,
dob date
);
create table ancestor (
ancestor_id integer,
descendant_id integer,
distance integer
);
Данные создаются как это:
person_id name dob
1 Pops 1900/1/1
2 Grandma 1903/2/4
3 Dad 1925/4/2
4 Uncle Kev 1927/3/3
5 Cuz Dave 1953/7/8
6 Billy 1954/8/1
ancestor_id descendant_id distance
1 1 0
2 2 0
3 3 0
4 4 0
5 5 0
6 6 0
1 3 1
2 3 1
1 4 1
2 4 1
1 5 2
2 5 2
4 5 1
1 6 2
2 6 2
3 6 1
можно теперь выполнить запросы arbitary, которые не включают присоединение к таблице назад на себе, который произошел бы, если у Вас есть heirachy отношения в той же строке как узел.
, у Кого есть бабушка и дедушка?
select * from person where person_id in
(select descendant_id from ancestor where distance=2);
Все Ваши потомки:
select * from person where person_id in
(select descendant_id from ancestor
where ancestor_id=1 and distance>0);
, Кто дяди?
select decendant_id uncle from ancestor
where distance=1 and ancestor_id in
(select ancestor_id from ancestor
where distance=2 and not exists
(select ancestor_id from ancestor
where distance=1 and ancestor_id=uncle)
)
Вы избегаете всех проблем соединения таблицы к себе через подзапросы, общее ограничение является 16 subsuqeries.
Проблема, поддержание таблицы предка довольно трудно - лучше всего сделанный с хранимой процедурой.
Если цель теста очевидна, я не утруждаю себя документированием.
Если это неочевидно, потому что имеет дело с какой-то неясной ситуацией - или если я хочу сослаться на конкретная ошибка, например - в этот случай я добавлю документацию. Я не документирую выбросы исключений и т. Д. - просто краткое описание метода. Это случается сравнительно редко. Я, скорее всего, добавлю документацию для вспомогательных методов, используемых в нескольких тестах.
Я не нахожу никакой ценности в документации по тестовым случаям. Я просто делаю имя метода достаточно информативным, чтобы знать цель теста.
Я знаю, что в Ruby есть инструменты для создания документа из имени тестов, но я не видел ни одного из них в Java.
Независимо от того, javadoc или нет, я думаю, что модульные тесты обязательно должны быть задокументированы. В случаях, когда формальной спецификации не существует, модульные тесты - это то, что ближе всего к определению ожидаемого поведения кода. Документируя тестовые примеры, вы очень ясно дадите читателю понять, что тестирует тест и почему он тестируется.
Я думаю, что полезно составить javadoc условия, при которых тесты проходят.
Я не понимаю, почему вы должны рассматривать тестовые примеры иначе, чем ваш производственный код, в отношении комментариев.
Если рассматривать тесты как документацию, не имеет большого смысла «документировать документацию». Название каждого теста уже само по себе должно описывать, какова цель тестов - какое поведение задается этим тестом.
Используйте длинные описательные имена для тестов и сохраняйте тестовый код как можно более читабельным. .
Например, взгляните на тестовые примеры в этом проекте . Делает ли кто-нибудь из них что-то, что не является явно очевидным, если посмотреть на название тестов и тестовый код?
Только в некоторых редких случаях, когда тестовый код неясен, комментарии необходимы в тестах. Например, если вы тестируете многопоточный код, и тестовый код делает странные вещи, чтобы убедиться, что тестовый код выполняется в правильном порядке. Но даже в этих случаях комментарий является извинением за то, что не написал более чистый тестовый код.
Будет ли ересь утверждать, что комментарии к коду являются антипаттерном? Я согласен с приведенными выше ответами, в идеале ваш код был бы достаточно описательным, чтобы полагаться на него без комментариев. Это особенно верно, если вы находитесь в (корпоративной) среде, где люди, как правило, обновляют код, не обновляя комментарии, поэтому комментарии вводят в заблуждение.
черт возьми. даже если это просто ...
создать порядок, отредактировать порядок, сохранить, загрузить и проверить его.
если это действительно простой тест, то, возможно, и нет.
Я считаю, что по мере изменения кода иногда причина ибо тест уже не такой очевидный, как раньше.
Может быть, вы могли бы попросить кого-нибудь, кто не совсем знаком с вашим кодом, дать вам быстрый ответ относительно того, легко ли понять ваши тесты, как они есть.
В компании, в которой я работаю, мы стараемся давать нашим тестам описательные имена и сложность документа, но часто бывает трудно сделать это «правильно» в первом черновике, потому что вещи, очевидные для разработчика, не всегда очевидны для другие.
Тесты обрабатываются как код и представляются как часть процесса экспертной оценки, поэтому наша (небольшая) команда может прокомментировать, легко ли понять тест или нет.
Если тест немного сбивает с толку, мы можем соответствующим образом обновить название или документацию и получить более точную оценку того, что работает, а что нет.