Это вопрос мышления. Вы должны найти «двойную» форму вашего вопроса (-> двойное отрицание).
Вам нужно найти все заказы, по крайней мере, на одной строке, которые еще не готовы.
Предполагая, что ваши таблицы являются общими:
Order ( ID , bla, bla, bla) и Строка заказа ( orderID, строка № , статус, бла, бла) FK или порядок ссылок ссылок.
Вы можете использовать эту заглушку:
Select *
from orders O
where not exists ( select * from order_line OL
where ol.orderID=O.orderID --binding with outer query
and status <> 'ready'
)
ПОБОЧНОЕ ПРИМЕЧАНИЕ: мой запрос будет выдавать также пустые ордера, чтобы отфильтровать их, просто добавив к внешнему запросу and exists (select * from orderline oe where oe.orderid=o.orderid)
Считав веб-страницу Fowler на нем, я не вижу преимущества для выполнения его тот путь. Единственное возможное усиление путем изоляции выражения, которое может часто использоваться в одно место, но это было бы лучше всего обработано:
double basePrice = basePrice();
if (basePrice > 1000)
return basePrice * 0.95;
else
return basePrice * 0.98;
Fowler не предлагает объяснения, почему его пересмотренный код лучше, чем оригинал, кроме прочитать его книгу.
Это предназначается, чтобы быть более разоблачающим намерения кода. В некоторых случаях этим можно злоупотребить, но вряд ли. например, Вы могли обновить запросы для 5%-х и 2%-х скидок с запросами, но от имени методов Вы могли описать в причине имени скидки. помните, это может быть очевидно сегодня, но через 6 месяцев это не могло бы быть так - как я говорю - не вопрос, если я забываю, но когда я забываю.
if (basePrice() > 1000)
return bigTicketDiscount()
else
return regularDiscount()
double bigTicketDiscount(){
return basePrice() * 0.95;
}
double regularDiscount(){
return basePrice() * 0.98
}
Мне действительно кажется, что путем выполнения этого Вы помогаете сделать единственную цель к своему исходному методу; Это больше не ответственно за вычисление basePrice и сниженной цены (или независимо от того, что случается так, что это вычисляет). Это - пример принесения в жертву некоторых циклов ЦП для создания кода более удобным в сопровождении. "Потраченные впустую" циклы CPU - вероятно, не что-то, что Вы заметите для одного, и также возможно, что компилятор мог оптимизировать его (возможно, замечая, что метод относительно прост и вместо того, чтобы назвать метод, это вводит фактический код (больше как макрос). Так или иначе эти типы оптимизации лучше всего оставляют машинам, оставляя людей с более чистым кодом, чтобы продолжить работать.
Я думаю, что большая часть полезности этого рефакторинга заключается не в его применении, а в качестве шага к методу извлечения, который является чрезвычайно распространенным и полезным. В тех случаях, когда локальная переменная препятствует использованию метода извлечения или усложняет его дополнительными параметрами, «замените временную переменную на подсказку по запросу», чтобы упростить извлечение метода. Также в этих случаях созданный метод запроса повторно используется двумя разными методами, которые являются результатом метода извлечения.