Skip to content

Category: programmingSyndicate content

Иван Ванков

Другата седмица е SoftUni Conf в Пампорово. Готини хора, готини лекции. Айде идвайте да се видим, че от тая работа не може да се засечем.
Който не бил не знае за какъв купон става дума след цял ден мъчене на програмистки въпроси :)

Leave A Commentposted in Общи by gatakka

 

C, PHP, VB, .NET

 Затваряния (Closures)

   от C, PHP, VB, .NET


Един интересен момент при писането на локални класове е свързан с достъпа до променливи и обекти, които са извън блока дефиниращ локалния клас. Оказва се, че локалните класове (и анонимните в частност) имат достъп до локални променливи и референции към обекти, които са извън техния обхват. Това важи също така и за новия по-модерен вариант с ламбда изрази в Java 8 (те са анонимни класове в крайна сметка). Има обаче едно сериозно ограничение – променливите или референциите трябва да са final. Нека дадем един първи елементарен пример:

 

C, PHP, VB, .NET

В Java 8 има една поредица от вградени функционални интерфейси, които имат важна роля при използването на ламбда изрази в библиотечните функции. Използването на тези интерфейси е силно насърчително (вместо създаването на собствени еквивалентни такива). В предишната статия вече говорихме за добре познатите Comparator, ActionListener и Runnable. Сега ще обърнем внимание на някои от новите интерфейси, които идват с Java 8.

java.util.function.Function

Function е може би най-стандартния функционален интерфейс – той получава обект за входен параметър, обработва данните от него и връща друг обект като резултат. Дефиницията му е следната:

 

Иван Ванков

Замисляли ли сте се, кое е най-дразнещото и време отнемащо нещо в целия процес на разработка? Клиентите? Да, може да се каже, но някак си без тях няма да е същото. Може би бъговете? Ако не правим бъгове защо му е на някой въобще да ни плаща? Според мен това е публикуването на кода, особено когато се работи в екип. Отдавна мина времето когато можеше да разработваме дълго и да публикуваме рядко. Но дори и тогава този процес не бе лесен и приятен, просто се налагаше да го правим по-рядко. Кода е готов, събираме всичко от колегите, оправяме ENV, конфугурации, миграции на структури и бази, зависимости,засилваме кода и новата версия вече работи…. Така поне изглежда процеса на хартия и в очите на „началството“, но на практика…… Ако сте си изградили добра система за автоматизиране на всички тези задачи най-вероятно всичко ще става с доста по-малко усилия, но колко е лесно да се изгради такава инфраструктура?

 

C, PHP, VB, .NET

 Методи по подразбиране

   от C, PHP, VB, .NET


Както вече знаем, ламбда изразите работят само и единствено с функционални интерфейси. Това е логично, защото ако един интерфейс има повече от един метод, компилатора няма как да знае кой от методите да използва при конвертирането на ламбда израза. Това е нормално и не подлежи на коментар. Интересен е обаче въпроса как да разширим съществуващи интерфейси, като им добавим допълнителни методи, които да могат да работят с ламбда изрази.

Нека дадем един класически пример – добре познатият интерфейс Collection. Можем да проверим, че той наследява интерфейс Iterable. Нека видим как са реализирани тези интерфейси в Java 7:

 

C, PHP, VB, .NET

 Ламбда изрази

   от C, PHP, VB, .NET


Ламбда изразите са функционалност, която е дълго чакана в Java. Появява се с версия Java 8 и е първата крачка към добавяне на… нека не казваме „елементи“, а по-скоро „еквиваленти“ на функционално програмиране в езика. При положение, че един от основните конкуренти на Java – .Net framework – ги поддържа още с версия 3.5 от 2007 г., може да се каже, че от Oracle (Sun) са доста закъснели. Разбира се това си има и причина – до известна степен ламбда изразите нарушават основната философия на абстрактния модел на интерфейсите в Java (за това няма да пишем сега, а в следваща статия по-подробно). Тук ще разгледаме общата философия на ламбда изразите и начина на работа с тях.

 Деф. Ще наричаме един интерфейс „функционален интерфейс“ ако притежава само един единствен абстрактен метод.

 

C, PHP, VB, .NET

Задача 1. Създайте клас за филми (Movie) с член променливи име (name – тип String), времетраене в секунди (length – int) и трейлър (trailer – FileInputStream). Минималният брой на секундите в един филм трябва да e 3600. Създайте само един конструктор – с подадени параметри.

Задача 2. В клас Movie добавете следните методи:

a) static boolean equalTrailers(FileInputStream movie1, FileInputStream movie2) – методът трябва да сравни двата файла байт по байт и да върне true ако двата подадени трейлъра са с еднакво съдържание или false ако са различни;

b) static int compareMovieLenghts(Movie m1, Movie m2) – връща -1 ако m1 е с по-голяма продължителност от m2, 0 ако са равни по продължителност или 1 ако m2 е по-дълъг от m1.

c) Int compareWith(Movie m) – сравнява текущия обект (филм) с друг подаден като параметър на същия принцип, както е сравнение в подточка b)

 

C, PHP, VB, .NET

Това е набързо написано (като за контролно :P) примерно решение на задачата от днешната контролна работа. Вероятно може много неща по него да се изгладят. Не е тествано въобще с реални данни – може да не е съвсем коректно. Моля ако някой има време, да го изпробва и да каже ако и къде има проблеми. Изтеглете сорс кода.

Задача 1. Създайте клас за фотоалбум (PhotoAlbum) с член променливи „брой страници“ (pagesCount – тип int) и списък от снимки (масив photos от тип FileInputStream). Максималният брой на снимките в един албум не трябва да превишава pagesCount*3 – това трябва да са границите на масива. Погрижете се новосъздаден фотоалбум да има минимум 10 страници. Освен конструктор с подадени параметри, трябва да създадете и конструктор по подразбиране, в който се създава нов празен албум с 16 страници.

Решение:

 

Иван Ванков

 Laravel първи стъпки – SoftUni

   от Иван Ванков


В този семинар се опитвам да обясня някой от основните концепци на Laravel както и какво е REST.
Как се инсталиара
Какво е REST
Какво е Composer
Какво са Routes
Как да ползваме resource controllers
Как да използваме Blade
Работа с бази данни
Регистрация и вход на потребител

 

C, PHP, VB, .NET

Дадена е таблица, в която има дублиращи се записи. Вашата задача е да изтриете всички повторения (т.е. да остане по един запис от всеки дубликат). Задачата звучи привидно тривиална. Нека създадем примерна таблица и да я напълним с информация:

CREATE TABLE people(
    id SERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL
)ENGINE = InnoDB;

INSERT INTO people (name)
VALUES ("georgi"), ("ivan"), ("teodor"),
       ("georgi"), ("petar"), ("ivan"), ("philip"),
       ("ivan"), ("maria"), ("petar"), ("georgi");

Стандартно бихме подходили по следния начин – DELETE заявка, в чиято WHERE клауза изреждаме id-тата на редовете, които трябва да бъдат изтрити. Тях, естествено, намираме с вложен SELECT: