Прочитал у Гетца статью В погоне за качеством кода: Безопасное программирование с помощью АОП, потрогал — понравилось.
Это методика контрактного программирования, основанная на использовании AspectJ-компилятора и библиотеки Oval, определяющей пред- и постусловия проверок контрактов на основе аннотаций. Кроме аннотации @NotNull в Oval море всего вкусного.
К примеру, код бизнесс-класса компании:
/**
* Компания
*/
@Guarded
public class Company {
@NotNull
private String name;
@NotNull
private String legalAddress;
@NotNull
private String postAddress;
@NotNull
private String telephone;
@NotNull
@MatchPattern(pattern = "^\\d*$")
@PossibleLength(lengths = { 0, 10, 12 })
private String tin; // ИНН физ. и юр. лица различаются по длине
@NotNull
@MatchPattern(pattern = "^\\d*$")
@PossibleLength(lengths = { 0, 9 })
private String kpp; // КПП строго 9 цифр
@NotNull
@Assert(expr = "_value.every{it in '0'..'9'} && (_value.size() == 0 || _value.size() == 9)", lang = "groovy")
public String _kpp;
//...
}
@NotNull, @MatchPattern (в примере шаблон проверяет строку на налии только цифр) — аннотации в стандартной поставке Oval.
@PossibleLength — определил самостоятельно (нет в Oval такого контракта: возможные длины строки, есть только минимальная-максимальная), заняло это 5 минут: определить аннотацию и переопределить реализацию класса проверки.
@Assert — это также стандартная аннотация Oval, в ней идет проверка с использованием языка Groovy, по сути проверки kpp и _kpp идентичны, но на Groovy выглядит выразительнее, да и написать быстрее.
Вот ещё ссылка по теме от классика — Bertrand Meyer: http://se.ethz.ch/~meyer/publications/lncs/attached.pdf
_>но с появлением java 5 и эту проблему можно решить через annotation, _>кто-нибудь это уже сделал ?
_>простую и банальную
_>
я знаю,
как Вы понимаете, это только при использовании idea-компилятора, что не есть универсально
хочется именно source этого annotation'а, чтобы использовать и в других местах, и не тащить ради этого весь idea-хвост
Здравствуйте, bob_marlin, Вы писали:
_>Здравствуйте, ykk, Вы писали:
ykk>>Здравствуйте, bob_marlin, Вы писали:
ykk>>В Intellij IDEA 5.0 добавили "@Nullable/@NotNull annotations and inspections"http://www.jetbrains.com/idea/features/newfeatures.html#nullable
_>я знаю, _>как Вы понимаете, это только при использовании idea-компилятора, что не есть универсально _>хочется именно source этого annotation'а, чтобы использовать и в других местах, и не тащить ради этого весь idea-хвост
А нет у него никакого source. Это делается с помощью "IntelliJ IDEA's on-the-fly code inspections"
annotation — это декларативная информация, выполняться там ничего не может.
Здравствуйте, all-x, Вы писали:
_>>выплюнул ошибку, при попытке проставить ему null)
AX>По-моему, это не правильно. Цель в том, чтобы ловить подобные ошибки на этапе компиляции, а NPE при выполнении получить всегда успеем
ну не всегда, допустим у нас есть bean, так вот — не хочется, чтобы ему кто-то делал setSmth(null), где setSmth такой:
public voic setSmth(Object smth){
_smth = smth;
}
ибо потом NPE мы уже выловим в другом месте, а причиной послучил вызов этого setter'а с null'ом. И тем более не всегда на этапе компиляции это возможно. Но в то же время не хочется в каждом методе писать
Здравствуйте, bob_marlin, Вы писали:
_>Здравствуйте, all-x, Вы писали:
_>>>выплюнул ошибку, при попытке проставить ему null)
AX>>По-моему, это не правильно. Цель в том, чтобы ловить подобные ошибки на этапе компиляции, а NPE при выполнении получить всегда успеем
_>ну не всегда, допустим у нас есть bean, так вот — не хочется, чтобы ему кто-то делал setSmth(null), где setSmth такой:
_>
_>ибо потом NPE мы уже выловим в другом месте, а причиной послучил вызов этого setter'а с null'ом.
Это можно поймать при компиляции вызова setter'a.
_>И тем более не всегда на этапе компиляции это возможно. Но в то же время не хочется в каждом методе писать _>
_>assert smth != null : "Non null expected";
_>
Согласен. Кстати, можно попробовать решить проблему по-другому — вставить эти проверки с помощью аспектов.
Хочеться поднять тему. Кто нибудь использовал данную возможность в разработке?
Это реально помогало работе, повышению качества кода? Появились ли какие наработки, чтоб это можно было видеть не только в Idea, но и проверять во время сборки проекта с помощью ant?