Ця замітка містить ряд хитрощів, що дозволяють скоротити код, одержаний після застосування патерну «стратегія». Як неважко здогадатися з назви, всі вони так чи інакше пов'язані з використанням generic-типів.

Читати далі →

Знайомство з командою курсів стека Java на Hexlet

Привіт, Хабраюзер. Ми давно хотіли стати трохи ближче до тебе. І сьогодні настільки тривало що зріє ідея розповісти тобі більш докладно про те: «хто і які курси Java стека на Хекслет робить» — втілилася! Як думаю — стало зрозуміло: ми розповімо Вам про курси над якими ми працювали останні пів року, включаючи останній курс який ось-ось почали записувати: Java Web-сервісів.



Читати далі →

Застосовуємо дженерики в RAD Studio Delphi. Створюємо бібліотеку сортування списків однотипних об'єктів

Сьогодні будемо створювати в RAD Studio Delphi бібліотеку класів, що реалізують сортування списків однотипних об'єктів.

Мета завдання

Прикладної розробник повинен отримати інструмент для створення дочірніх класів, в яких можна:

  • оперувати з об'єктами списку;
  • застосовувати різні правила порівняння об'єктів;
  • застосовувати різні алгоритми сортування об'єктів.
На виході повинна вийти бібліотека класів, яка дозволяє:

  • прикладного розробнику сортувати будь 100 об'єктів будь-яким з 100 методів сортування;
  • допрацьовувати і підтримувати нові алгоритми або нові типи об'єктів протягом одного дня силами одного фахівця.

Читати далі →

Узагальнення в Kotlin vs. Узагальнення в JAVA: подібності, відмінності, особливості


Ця стаття про Узагальнення в Kotlin — особливості їх використання, подібності та відмінності з Узагальнення в Java.

В двох словах про УзагальненняЯкщо коротко, то Узагальнення — це спосіб сказати, що клас, інтерфейс або метод будуть працювати не з якимось конкретним типом, а просто з якимось. З яким саме буде визначено з контексту. Наприклад:

public interface List<E> extends Collection<E> {
//...
}

Заздалегідь невідомо, об'єкти якого класу будуть міститися у списку, але це визначиться при його використанні:

List < String> list = new ArrayList<>();

Тепер це не просто список, а список рядків. Узагальнення допомагають забезпечити типобезопасность: List можна спробувати покласти будь-який об'єкт, але List<String> — тільки String або один з його нащадків.
Я розділю розповідь про Узагальнення на дві частини: власне Узагальнення і використання Wildcards. Поки мова не заходить про Wildcards, використання Узагальнення в Kotlin мало чим відрізняється від Java.

Читати далі →

Age of JIT compiling. Part II. CLR is watching you

Продовжуючи тему JIT-компіляції .NET'a, сьогодні ми розглянемо диспетчеризацію методів у інтерфейсів, узагальнення (як класів, так і окремих методів разом з реальними сигнатурами); проводити налагодження релізних збірок з оптимизациями; розберемося з істинним призначенням типу System.__Canon (це не те, що Ви подумали).

Читати далі →

Ефективний JSON з функціональними концепціями і узагальнення в Swift

Це переклад статті Tony DiPasquale «Efficient in JSON Swift with Functional Concepts».

Передмова перекладача.
Переді мною була поставлена задача: закачати дані у форматі JSON Flickr.com про 100 топ місцях, в яких зроблені фотографії на даний момент, в масив моделей:

//------ Масив моделей Places
struct Places { 
var places : [Place]
}

//----- Модель Place
struct Place {

let placeURL: NSURL
let timeZone: String
let photoCount : Int
let content : String

}

Окрім суто прагматичної завдання, мені хотілося подивитися як в Swift працює «висновок типу з контексту» (type Inference), які можливості Swift у функціональному програмуванні, і я вибрала для парсингу JSON алгоритми з статті Tony DiPasquale «Efficient in JSON Swift with Functional Concepts and Узагальнення», в якій він «протягує» generic тип
Result<A>
для обробки помилок по всій ланцюжку перетворень: від запиту в мережу до розміщення даних у масив Моделей для подальшого подання до
UITableViewController
.
Щоб подивитися Swift працює «в зв'язці» Objective-C, для зчитування даних з Flickr.com використовувався Flickr API, представлений в курсі Стенфордського Університету «Stanford CS 193P iOS 7», написаний на Objective-C.
В результаті крім невеликого розширення Моделей:
extension Place: JSONDecodable {
static func create(placeURL: String)(timeZone: String)(photoCount: String)(content: String) -> Place {
return Place(placeURL: toURL(placeURL), timeZone: timeZone, photoCount: photoCount.toInt() ?? 0, content: content)
}
static func decode(json: JSON) -> Place? {
return _JSONParse(json) >>> { d in
Place.create
<^> d <| "place_url"
<*> d <| "timezone"
<*> d <| "photo_count"
<*> d <| "_content"
}
}
}

extension Places: JSONDecodable { 
static func create(places: [Place]) -> Places {
return Places(places: places)
}
static func decode(json: JSON) -> Places? {
return _JSONParse(json) >>> { d in
Places.create
<^> d <| "places" <| "place"

}
}
}

мені довелося самостійно написати лише три рядки коду:

Читати далі →