Niezalogowany [ logowanie ]
Subskrybuj kanał ATOM Kanał ATOM

Autor wpisu: Śpiechu, dodany: 15.08.2012 20:12, tagi: internet

Dzisiejszy krótki wpis bardziej nadaje się na jakiegoś mikrobloga. Nie posiadam takowego, więc piszę tu. Od razu disklajmer: ani Nokia, ani Agito nic mi nie dały za wychwalanie swoich produktów/usług. Wychwalam z czystej dobroci serca :-)

Niedawno przysłali mi pocztą kartę SIM w ramach darmowego internetu z Aero2. Z rekomendowanych przez Aero urządzeń współpracujących z usługą dominują same Huaweje kosztujące często powyżej 300 zł. Postanowiłem uderzyć w nieznane i kupiłem coś innego — tańszego. Zdecydowałem się na zakup „gwizdka” firmy Nokia USB 21M-02 Dual Band za 199 zł w Agito.pl. Pracuję niedaleko punktu odbioru osobistego w Katowicach, więc wybór był czysto pragmatyczny (bo po co płacić za przesyłkę?)

Kilka słów o samym urządzeniu:

  • przyjmuje zwykłe karty SIM, więc nie radzę całkiem wyłamywać obudowy karty Aero do końca aby pasowało do microSIM,
  • można zrobić z tego pendrive za pomocą karty microSD (WTF jak oni to wszystko zmieścili),
  • posiada własną pamięć, na której są instalki programu obsługującego modem pod Windows, pakiet DEB pod Ubuntu i skrypt shella dla pozostałych dystrybucji,
  • świeci ładnie na niebiesko gdy złapie 3G.

Ogólnie jestem trochę w szoku, że producent nie potraktował użytkowników Linuksa jak zwykle: „tu masz stery do Windowsa, a jak jesteś taki cwany, że używasz czegoś innego to radź sobie sam”.

Jakość darmowego internetu to dla mnie rozwiązanie na sytuacje awaryjne. Po stronach pochodzisz, maila sprawdzisz, ale YouTuba powyżej 240p płynnie nie pooglądasz. Dla ludzi często podróżujących i z małych miejscowości jak znalazł.

Autor wpisu: Łukasz Socha, dodany: 13.08.2012 09:54, tagi: php

pobierz w .pdf(przeznaczone do wydruku)

Budowniczy jest wzorcem, gdzie proces tworzenia obiektu podzielony jest na kilka mniejszych etapów, a każdy z nich może być implementowany na wiele sposobów. Dzięki takiemu rozwiązaniu możliwe jest tworzenie różnych reprezentacji obiektów w tym samym procesie konstrukcyjnym.

Diagram klas wzorca Builder

Standardowo wzorzec składa się z dwóch podstawowych elementów. Pierwszy z nich oznaczony jest jako Builder – jego celem jest dostarczenie interfejsu do tworzenia obiektów nazywanych produktami (product). Drugim elementem jest obiekt oznaczony jako ConcreteBuilder, a jego celem jest tworzenie konkretnych reprezentacji produktów przy pomocy zaimplementowanego interfejsu Builder. W ConcreteBuilder zawarte są procedury odpowiedzialne za konstrukcje i inicjalizację obiektu. Strukturę wzorca uzupełnia obiekt Director (zwany także czasem kierownikiem, nadzorcą – tak jak na budowie ;) ), który zleca konstrukcję produktów poprzez obiekt Builder dbając o to, aby proces budowy przebiegał w odpowiedniej kolejności.

Diagram sekwencji wzorca Builder

Przykładowa implementacja

<?php

class Product {

    private $part1;
    private $part2;

    public function setPart1($part1) {
        $this->part1 = $part1;
    }
    public function getPart1() {
        return $this->part1;
    }
    public function setPart2($part2) {
        $this->part2 = $part2;
    }
    public function getPart2() {
        return $this->part2;
    }

}

interface Builder {
    public function buildPart1();
    public function buildPart2();
}

class ConcreteBuilder implements Builder {
    private $product;

    public function __construct() {
        $this->product = new Product();
    }
    public function buildPart1() {
        $this->product->setPart1("1. faza budowy");
    }
    public function buildPart2() {
        $this->product->setPart2("2. faza budowy");
    }
    public function getProduct() {
        return $this->product;
    }

}

class Director{
    private $builder;
    
    public function __construct() {
        $this->builder = new ConcreteBuilder();
    }
    public function construct() {
        $this->builder->buildPart1();
        $this->builder->buildPart2();
    }
    public function getResult() {
        return $this->builder->getProduct();
    }
}

// testy
$director = new Director();
$director->construct();
$product = $director->getResult();
echo $product->getPart1(); // wyswetli "1. faza budowy"
echo $product->getPart2(); // wyswieli "2. faza budowy"

?>

Przykład z życia wzięty

Tworząc serwis udostępniający filmy wideo chcemy mieć możliwość wyboru technologii do generowania odtwarzacza wideo. Możemy użyć do tego budowniczych.

<?php 
class Player {
    private $player;
    
    public function setplayer($player) {
        $this->player = $player;
    }
    public function render() {
        return $this->player;
    }
}

interface Builder {
    public function buildPlayer();
    public function getPlayer();
}

class FlashBuilder implements Builder {
    private $player;

    public function __construct() {
        $this->player = new Player();
    }
    public function buildPlayer() {
        $this->player->setPlayer("Player w Flash");
    }
    public function getPlayer() {
        return $this->player;
    }
}

class HTMLBuilder implements Builder {
    private $player;

    public function __construct() {
        $this->player = new Player();
    }
    public function buildPlayer() {
        $this->player->setPlayer("Player w HTML5");
    }
    public function getPlayer() {
        return $this->player;
    }
}

class Director{
    private $builder;
    
    public function __construct(Builder $builder) {
        $this->builder = $builder;
    }
    public function construct() {
        $this->builder->buildPlayer();
    }
    public function getResult() {
        return $this->builder->getPlayer();
    }
}

// testy
$html = new HTMLBuilder();
$flash = new FlashBuilder();
$director = new Director($flash);
$director->construct();
$player = $director->getResult();
echo $player->render(); // wyswietli "player w flash"

$director2 = new Director($html);
$director2->construct();
$player2 = $director2->getResult();
echo $player2->render(); // wyswietli "player w HTML5"

?>

Dwaj budowniczy FlashBuilder i HTMLBuilder mają za zadanie stworzyć obiekt Video z uwzględnieniem wykorzystanej technologii. Z kolei Director „pilnuje” poprawnej kolejności wywoływania metod. Dzięki wykorzystaniu Dependency Injection możemy łatwo dodawać kolejnych budowniczych.

Zalety i wady

Zalety:

  • Duża możliwość zróżnicowania wewnętrznych struktur klas.
  • Duża skalowalność (dodawanie nowych reprezentacji obiektów jest uproszczone).
  • Większa możliwość kontrolowania tego, w jaki sposób tworzony jest obiekt (proces konstrukcyjny jest niezależny od elementów, z których składa się tworzony obiekt.

Wady:

  • Duża liczba obiektów reprezentujących konkretne produkty.
  • Nieumiejętne używanie wzorca może spowodować nieczytelność kodu (jeden produkt może być tworzony przez zbyt wielu budowniczych).

Zastosowanie

Wzorzec budowniczego stosowany jest do oddzielenia sposobu tworzenia obiektów od tego jak te obiekty mają wyglądać. Przykładem jest oprogramowanie konwertujące tekst z jednego formatu na drugi. Algorytm odczytujący i interpretujący dane wejściowe jest oddzielony od algorytmu tworzącego dane wyjściowe. Dzięki takiemu rozwiązaniu możliwe jest zastosowanie jednego obiektu odczytującego dane wejściowe oraz wielu obiektów konwertujących odczytane dane do różnych formatów (ASCII, HTML, RTF, itp.), co zwiększa skalowalność rozwiązania.

Innym zastosowaniem może być stworzenie narzędzia, które będzie miało różną implementację zależnie od użytej technologii – tak jak w omawianym przykładzie odtwarzacz wideo.

Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

Autor wpisu: batman, dodany: 11.08.2012 20:57, tagi: internet

Pewnego pięknego dnia (piątek zawsze jest piękny), nieco po godzinie 13, jedna z ikonek w tray’u, złowieszczo rozświetliła się żółtym wykrzyknikiem informującym o braku dostępu do sieci. Nic to, pomyślałem, przejściowe problemy się zdarzają, pewnie za chwilę wszystko wróci do (…)

Read the rest of this entry »

Autor wpisu: Śpiechu, dodany: 11.08.2012 13:48, tagi: php

Od jakiegoś miesiąca definitywnie przesiadłem się na PHP 5.4. Napiszę dzisiaj o kilku ciekawostkach i nowych funkcjach, które ułatwią nam programistyczne życie (mówię „nam” z tej okazji, że od 1 sierpnia zmieniłem pracę i jestem oficjalnie zawodowym programistą :-) Zacznę jednak od nie do końca zrozumiałego skróconego operatora trójargumentowego dostępnego od wersji 5.3.

Wszyscy na pewno znacie typowy operator trójargumentowy (ang. ternary operator): (warunek) ? (gdy prawda) : (gdy fałsz). Nie wszyscy jednak korzystają z uproszczonej wersji (ang. shorthand TO): (warunek) ?: (gdy fałsz). Jest to rzecz często spotykana w kodzie źródłowym Symfony 2.

Zazwyczaj spotykamy taką konstrukcję:

$var = true;
$var = $var === true ? 'true' : 'false';
// wynik to oczywiscie 'true'

Co jeżeli chcemy skorzystać z uproszczonej wersji?

// jesli $var ma wartosc false, '', null, []
// to wynikiem nastepnej operacji bedzie 'default value'
$var = $var ?: 'default value';

Jest to przydatna konstrukcja jeśli chcemy mieć pewność, że zmienna ma zawsze jakąś ustaloną wartość. Chroni nas to przed setkami instrukcji sprawdzających czy mamy jakieś nulle, falsy i puste stringi :-)

Wywoływanie metod bezpośrednio po instrukcji new ma częste zastosowanie np. wtedy, gdy właściwie nie potrzebujemy samej instancji obiektu, a tylko wynik konkretnej metody. Przykład:

(new DateTime())->format('Y-m-d');

W jednej linijce załatwiamy sprawę. Warunek to otoczenie new nawiasami okrągłymi.

Kolejna nowa możliwość 5.4 to bezpośrednie dobranie się do rezultatu działania funkcji zwracającej tablicę. Przypuśćmy, że nie interesuje nas wynik działania funkcji, a tylko fakt czy pojawił się jakiś błąd, np.

function foo() {
return ['result' => 'some result',
        'error'  => 'some nasty error'];
}
echo foo()['error'];
// wynik to 'some nasty error'

Wg mnie ta konstrukcja potencjalnie zaciemnia zrozumienie działania kodu, gdyż może nam umknąć, że wynik funkcji został „przycięty” do jednego klucza. Poza tym może sugerować, że funkcja jest źle zaprojektowana skoro często odwołujemy się tylko do części jej „produktu”.

Od 5.4 możemy wymusić typ callable argumentu przekazywanego do funkcji. Dodatkowo zademonstruję kilka sposobów wywoływania:

Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

Autor wpisu: bastard13, dodany: 10.08.2012 14:12, tagi: php, design, oop

wstęp

Abstrahując od tego, na co pozwala nam dany język programowania (np. PHP pozwala niestety na wszystko), to czy w interfejsie jest sens posiadać deklarację konstruktora? A co w przypadku klas abstrakcyjnych? Jak sądzicie, taka funkcjonalność może się przydać, czy raczej jest to coś zbędnego, czego najprawdopodobniej nigdy byście nie wykorzystali? Czytaj więcej »

Autor wpisu: bastard13, dodany: 06.08.2012 14:38, tagi: oop

o czytelności kodu raz jeszcze

Było o tym, jakie stosować nazwy w kodzie, było o komentarzach, a teraz przyszła pora na kolejny wpis dotyczący czytelności kodu. I ponownie poruszam temat błahy, ale mam nadzieję, że rady w nim zawarte komuś się przydadzą:)Dzisiaj będzie o kolejności, w jakiej atrybuty i metody powinny występować w kodzie, w zależności od ich definicji. Czytaj więcej »

Autor wpisu: Łukasz Socha, dodany: 05.08.2012 21:59, tagi: php

pobierz w .pdf(przeznaczone do wydruku)

Wzorzec adapter (znany także pod nazwą wrapper) służy do przystosowania interfejsów obiektowych, tak aby możliwa była współpraca obiektów o niezgodnych interfejsach. Szczególnie przydaje się przypadku wykorzystania gotowych bibliotek o interfejsach niezgodnych ze stosowanymi w aplikacji. W świecie rzeczywistym adapter to przejściówka, np. przejściówka do wtyczki gniazdka angielskiego na polskie.

Diagram klas wzorca Adapter

Struktura wzorca składa się z elementów takich jak: Target, Adaptee, Adapter oraz Client. Target jest abstrakcją (zazwyczaj interfejsem), jakiej oczekuje klient. Elementem dostarczającym żądanej przez klienta funkcjonalności jest Adaptee (np. zewnętrzną biblioteką). Rolą adaptera, który implementuje interfejs Target, jest „przetłumaczenie” wywołania metod należących do interfejsu Target poprzez wykonanie innych, specyficznych metod z klasy Adaptee.

Przykładowa implementacja

<?php 
interface Target {
    public function  methodA();
}
class Adaptee {
    public function methodB() {
        echo "Metoda B";
    }
}
class Adapter implements Target {
    public function methodA() {
        $adaptee = new Adaptee();
        $adaptee->methodB();
    }
}

//test
$client = new Adapter();
$client->methodA(); // wyswietli "metoda B"
?>

Przykład z życia wzięty

Przejmujemy administrację nad jakimś większym projektem i istnieje potrzeba wymiany starej biblioteki XML na nową. Oczywiście nazwy metod różnią się diametralnie. Zamiast poprawiać nazwy metod w całym projekcie możemy napisać adapter.

<?php 
interface OldXML {
    public function  writeXml();
}
class NewXML {
    public function xml() {
        echo "Kod XML";
    }
}
class XML implements OldXML {
    public function writeXml() {
        $adaptee = new NewXML();
        $adaptee->xml();
    }
}

//test
$client = new XML();
$client->writeXml(); // wyswietli "Kod XML"
?>

Interfejs OldXML zawiera zestaw metod starej biblioteki. NewXML jest klasą nowej biblioteki. Natomiasr klasa XML jest swoistą przejściówką pomiędzy dwoma wersjami klas.

Zastosowanie

Wzorzec adaptera stosowany jest najczęściej w przypadku, gdy wykorzystanie istniejącej klasy jest niemożliwe ze względu na jej niekompatybilny interfejs. Drugim powodem użycia może być chęć stworzenia klasy, która będzie współpracowała z klasami o nieokreślonych interfejsach.

Powiązane tematy

Wszystkie wpisy należą do ich twórców. PHP.pl nie ponosi odpowiedzialności za treść wpisów.