Программирование высшего порядка
Техники конвейеровна основе массивов и множеств
##Исследование техник конвейеров на основе массивов и множеств
Антипаттерн?
Это исследование преимуществ, получаемых, когда вы пишете всё как массив. (С использованием концепций Джедаев из SmallTalk)
Ниже несколько руководящих принципов:
-
Все входные данные имеют массивоподобную форму. Даже если это массив из 1 элемента.
-
Функции более высокого уровня обычно должны принимать И возвращать массивы. (За исключением методов‑обратных вызовов для циклов:
map/reduce/each/filter) -
99 из 100 разработчиков пишут код, страдающий от того, что я называю синдромом
acute schema surplusage. -
Остерегайтесь раздутых
class-backed models— со всеми предсказуемыми подводными камнями: хрупкоеinstance stateс множеством рычагов и переключателей, транзакции БД, блокировки SQL, асинхронность/мьютексы (которые всегда работают с первого раза), использование идиоматическихproperty getter/setters, и вашpublic/private/final/etcвыглядит безупречно, верно? -
Позвольте мне взять типичную задачу и shoehorn ~~~add~~~ некоторые размышления на основе множеств.
-
Гипотетический блог‑сайт содержит множество статей и ещё больше постов (комментариев).
-
Добавим метод
delete(см. ниже) — но с поддержкой как одиночных объектов, так и массивов.
package net.danlevy.why.java___why.you.got.all.the.dots____it.must.be.all.the.factories;
public class Post { public String title; public Date created; public String message;
public Post(String title, String message) { this.title = title; this.message = message; this.created = new Date(); }
public Date isArchived() { return this.created < new Date(2015, 0, 1); }
// Post.delete` can be called w/ a singular Post or an array of Post[] public static int delete(Post post) { List<Post> posts = new List<Post>(post); return delete(posts) }
public static int delete(List<Post> posts) { return posts.map(Dao.remove); }}Простите, если мой Java немного заржавел.