Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Слышал только один сколько нибудь весомый аргумент – статику сложнее покрыть тестами.Почему?
Т.е. если обстоятельства складываются так, что ваш метод не может быть меньше 300 строк, не стоит его дробить на отдельные методы. Названия таких методов ничего не скажут разработчику.
Иметь возможность легко подменять одну реализацию на другую — это здорово! Это действительно здорово. Но только в том случае если вы видите ситуацию, при которой вам это может понадобиться.
public DetachedCriteria build() {
final DetachedCriteria criteria = DetachedCriteria.forClass(Item.class);
criteria.add(eq("singleItem", singleItem));
if (itemId != null) {
criteria.add(eq("id", itemId));
}
if (StringUtils.isNotEmpty(itemName)) {
criteria.add(ilike("name", wildcard(itemName)));
}
if (itemSalePrice != null) {
criteria.add(eq("salePrice", itemSalePrice));
}
if (itemStorePrice != null) {
criteria.add(eq("storePrice", itemStorePrice));
}
if (StringUtils.isNotEmpty(itemProducer)) {
criteria.add(ilike("producer", wildcard(itemProducer)));
}
if (StringUtils.isNotEmpty(itemProducerCode)) {
criteria.add(ilike("producerCode", wildcard(itemProducerCode)));
}
if (StringUtils.isNotEmpty(itemDescription)) {
criteria.add(ilike("description", wildcard(itemDescription)));
}
if (StringUtils.isNotEmpty(itemSerialNo)) {
criteria.add(ilike("serialNo", wildcard(itemSerialNo)));
}
if (supplierEnterpriseId != null) {
criteria.add(sqlRestriction("{alias}.supplier_enterprise_fk = ?", supplierEnterpriseId, BIG_INTEGER));
}
if (itemTypeId != null) {
criteria.add(sqlRestriction("{alias}.item_type_fk = ?", itemTypeId, BIG_INTEGER));
}
if (upperItemId != null) {
criteria.add(sqlRestriction("{alias}.upper_item_fk = ?", upperItemId, BIG_INTEGER));
}
if (unitTypeId != null) {
criteria.add(sqlRestriction("{alias}.unit_type_fk = ?", unitTypeId, BIG_INTEGER));
}
if (!attributes.isEmpty()) {
addAttributeSearchConditions(criteria);
}
criteria.addOrder(Order.asc("id"));
return criteria;
}
Вообще отражение — это зло, которое должно использоваться В ИСКЛЮЧИТЕЛЬНЫХ случаях.
Если у тебя обвешан объект проксями и т.п, а ты пытаешься на прямую ему филды посеттить которые помечены как private.
И кстати то, что я описал — это НЕ тупое копирвоание свойств из одного объекта в другой. Это приведение объекта в нужное состояние.
Но зачем усложнять и без того сложные вещи?
if (condition) {
criteria.add(criteria_expr);
}
add_critera_if(condition, expr);
А что хорошего в add_critera_if
if (itemTypeId != null) criteria.add(sqlRestriction("{alias}.item_type_fk = ?", itemTypeId, BIG_INTEGER));
criteria.addIfNotNull(sqlRestriction("{alias}.item_type_fk = ?", itemTypeId, BIG_INTEGER)
В общем из простого но не очень компактного кода получатся макароны, которые сложнее читать.
Враппить его в другой класс и делать тучу методов оберток
ради того, что бы ОДИН раз использовать
Там можно, например выделить код распаковки архива в отдельную функцию, но это бессмысленно, потому что она больше нигде не используется.
Настоящая функция — это та, которая действительно используется повторно либо имеет традиционный функционал (граммар-наци, идите в жопу), например, выделение памяти и инициализация объекта.
В моем случае пришлось бы сочинять псевдо-функции, которые используются один раз и выделены только ради внешней компактности. На мой взгляд, функции ради компактности — зло.
функция должна делать что-то одно, при этом подразумевается «одно» в человеческом смысле, образующее одну операцию в голове разработчика.
Вы же вот чуть выше именно ради компактности ввели новый метод criteria.addIfNotNull, хотя там и оригинальный код достаточно читаем.
Во-первых, если написать метод правильно, то он будет выглядеть, скажем, так:
вон, парой строк выше проверяется isNotEmpty, а в конце — isEmpty
Писать для них отдельные методы?
Можно переделать метод в более общий — criteria.addIf(<выражение>, <атрибут>)
Должен быть метод isEmpty.
А как универсальный метод будет знать, какое условие добавить?
И да, я не вижу никакой принципиальной разницы между addIfNotNull и addIf.
На мой взгляд, addIfNotNull даже хуже, потому что неточно описывает поведение метода для строк.
Методы без слова not удобнее, потому что когда нужно проверить противположное условие, приходится городить огород из двух отрицаний if (!my.attrIsNotSet).
То есть, по вашему, addIf недостаточно ясно выражает намерения кода и описывает алгоритм, а addIfSpecified — достаточно? :) При этом сам алгоритм внутри предполагается одинаковым, разница в названии.
Код метода должен вмещаться на экран монитора.Сначала подумал, что имеется ввиду, что в ширину (как в руби или пайтоне 80 символов), только потом дошло, что в высоту.
Стереотипность мышления в программировании