Archiwum kategorii: Daj się poznać 2017

10Things - Implementacja kontenera IoC

10Things – Implementacja kontenera IoC

Ciąg dalszy pracy na projektem 10Things. W dzisiejszym odcinku chciałbym opisać szczegóły implementacji kontenera IoC, oraz dalszy plan prac.

Implementacja kontenera IoC

W 10Things używam FreshMVVM, który ma zaimplementowany kontener IoC o nazwie FreshIoC. Pod spodem nie jest to nic innego jak TinyIoC ze zmienionymi namespace.

Jakie ma plus FreshIoC <-> TinyIoC?

  • Mały rozmiar – bibliotek FreshIoC waży tylko 42 Kb co czyni ją jedną z najlżejszych implementacji kontenera IoC
  • Prostota – robi tylko to co od niej oczekujemy, nie ma tutaj różnych „wodotrysków”
  • Szybkość – ze względu na rozmiar i prostotę jest bardzo szybki

Jakie ma minusy  FreshIoC < – > TinyIoC?

  • Wodotryski – brakuje w nim różnych zaawansowanych funkcjonalności kontenerów IoC

No dobra ale co sam autor twierdzi\pisze o tej bibliotece? Jako, że nie ma szczegółowego opisu FreshIoC będę się wspierał opisem TinyIoC.

Witaj TinyIoC

Welcome to TinyIoC – an easy to use, hassle free, Inversion of Control Container. TinyIoC has been designed to fulfil a single key requirement – to lower the „level of entry” for using an IoC container; both for small projects, and developers who are new to IoC who might be „scared” of the „big boys”!

To that end, TinyIoC attempts to stick to the following core principals:

  • Simplfied Inclusion – No assembly to reference, no binary to worry about, just a single cs file you can include in your project and you’re good to go. It even works with both Mono and MonoTouch for iPhone development!
  • Simplified Setup – With auto-resolving of concrete types and an „auto registration” option for interfaces setup is a piece of cake. It can be reduced to 0 lines for concrete types, or 1 line if you have any interface dependencies!
  • Simple, „Fluent” API – Just because it’s „Tiny”, doesn’t mean it has no features. A simple „fluent” API gives you access to the more advanced features, like specifying singleton/multi-instance, strong or weak references or forcing a particular constructor.

Tak autor określa funkcjonalność TinyIoC. Ale co nam po długich opisach, ahah i ochach nad biblioteką. Pora na porcję kodu jak tego w ogóle użyć.

Implementacja kontenera IoC. Mięcho, czyli Inversion Of Control po polsku

Mi osobiście bardziej podchodzi implementacja bez użycia Fluent API jak również wolę używać instancji jako Singleton.
Według Wiki Singleton to

Singleton – kreacyjny wzorzec projektowy, którego celem jest ograniczenie możliwości tworzenia obiektów danej klasy do jednej instancji oraz zapewnienie globalnego dostępu do stworzonego obiektu. Niekiedy wzorzec uogólnia się do przypadku wprowadzenia pewnej maksymalnej liczby obiektów, jakie mogą istnieć w systemie[1]. Niektórzy programiści uznają go za antywzorzec, ponieważ łamie zasady projektowania obiektowego, często bywa nadużywany[2] lub sprowadza się do stworzenia obiektowego zamiennika dla zmiennej globalnej[3][4].

Prosta rejestracja interfejsu w kontenerze

FreshIOC.Container.Register<IDataService, MockDataService); //As Singleton
FreshIOC.Container.Register<IUserDialogs>(UserDialogs.Instance); //As Singleton

Można użyć również Fluent API do rejestracji

FreshIOC.Container.Register<IDataService, MockDataService>().AsSingleton();
FreshIOC.Container.Register<IUserDialogs>(UserDialogs.Instance).AsMultiInstance();

Wstrzykiwanie zależności z użyciem konstruktora i nie tylko

W 10Things używam wstrzykiwania zależności za pomocą konstruktora co według mnie jest dobrą praktyką programistyczną. Znacznie lepszą niż użycie słówka Resolve.

Przykładem na użycie może być

public class MainViewPageModel
{
readonly IDataService dataService;
readonly IUserDialogs userDialogs;

public MainViewPageModel(IDataService dataService, IUserDialogs userDialogs)
{
this.dataService = dataService;
this.userDialogs = userDialogs;
}
}

Można to również zaimplementować używając słówka Resolve.

public class MainViewPageModel
{
readonly IDataService dataService;
readonly IUserDialogs userDialogs;

public MainViewPageModel()
{
this.dataService = FreshIOC.container.Resolve<IDataService>();
this.userDialogs = FreshIOC.container.Resolve<IUserDialogs>();
}
}

Jak widzicie użycie kontenera IoC nie musi być skomplikowane i trudne. Można to zrobić dużo prościej, przyjemniej. Podsumowując kontenerów Inversion Of Control jest tyle co grzybów po deszczu i każdy może znaleźć coś dla siebie. Ja wolę używać czegoś co jest lekkie i ma to co jest mi obecnie potrzebne.

10Things – co dalej

Będę rozwijał kolejne funkcjonalości aplikacji. Obecnie w planach mam dodanie obsługi menu (master detail), oraz stworzenie kontrolki kalendarza from scratch lub użycie gotowej. Chociaż wszystko wyjdzie w trakcie pracy.

Podsumowanie tygodnia

Podsumowanie tygodnia odc.1

A więc mamy już piątek 10.03 więc czas na podsumowanie tygodnia. Za nami pierwszy tydzień zmagań w Daj Się Poznać jak i również premiera Visual Studio 2017.

Poniżej garść moich osiągnięć i porażek, oraz co wydało mi się interesujące w minionym tygodniu.

Co się udało

  • 10Things – ruszyłem wreszcie z projektem i zacząłem implementację MVVM, oraz pierwszych stron
  • Uporałem się w pracy z dość „trudnym” tematem 🙂
  • Mój super tajny projekt „prezentu” na urodziny idzie zgodnie z planem

Co się nie udało

  • Ten tydzień był pasmem porażek ale wyniosłem z nich sporo wiedzy. Pamiętajcie, że można się zawsze czegoś nauczyć na swoich błędach
  • Nie udało mi się utrzymać mojego planu tygodnia
  • Nie udało mi się pisać na blog-a tak często jakbym chciał

Ciekawe linki tygodnia

GitHub

Xamarin

Różne i różniste

10Things nawigacja

10Things nawigacja – implementacja w mobile

A więc mamy kolejny tydzień konkursu, plan jaki sobie założyłem to implementacja nawigacji w 10Things. Jako, że aplikacja będzie korzystać z FreshMVVM dlatego też zacząłem zgłębiać tajniki nawigacji tego framework-a.

FreshMVVM daje nam 3 możliwe opcje nawigacji z pudełka „Basic navigation”, „Tabbed navigation” i „Master Detail navigation”.

Postaram się pokrótce przedstawić każdą z opcji, oraz jak ich użyć w aplikacji.

Jak zaimplementować – basic navigation

Jest to najprostsza i najczęściej spotykana forma nawigacji page-by-page. Zasada jej działania jest oparta na stosie FIFO. W implementacji jest ona bardzo prosta wystarczy zainicjować instancję FreshNavigationContainer.

Przykład

var page = FeshPageModelResolver.ResolvePageModel&lt;MainViewPageModel&gt;();
var navContaincer = new FreshNavigationContainer(page);
MainPage = navContainer;

Jak zaimplementować – master detail navigation

Jest to rodzaj nawigacji często spotykany w postaci szerokiej maści menu i nawigacjach typu rodzic dziecko. Pod maską do obsługi używa Dictionary<string, Page> do przechowania instancji PageModels.

Przykład

var navContainer = new FreshMasterDetailNavigationContainer();
navContainer.Init("Menu");
navContainer.AddPage&lt;MainViewPageModel&gt;("Ideas", null);
navContainer.AddPage&lt;SettingsViewPageModel&gt;("Settings", null);
MainPage = navContainer;

Jak zaimplementować – tabbed navigation

Tabbed navigation jest kolejnym często spotykanym rodzajem nawigacji w aplikacjach mobilnych. W Android jest to pasek zakładek wyświetlany na górze, natomiast w iOS pojawia się on na dole. Implementacja i użycie jest bardzo proste wystarczy utworzyć instancję FreshTabbedNavigationContainer.

Przykład

var navContainer = new FreshTabbedNavigationContainer();
navContainer.AddTab&lt;MainViewPageModel&gt;("Ideas", null);
navContainer.AddTab&lt;SettingsViewPageModel&gt;("Settings", null);
MainPage = navContainer;

Co dalej?

FreshMVVM daje nam dostęp do prostego API dzięki, któremu można w łatwy sposób zaimplementować niestandardową nawigację dziedzicząc po interfejsie IFreshNavigationService.

Przykład

public class CustomNavigationContainer : Xamarin.Forms.MasterDetailPage, IFreshNavigationService
{
....
}

var navContainer = new CustomNavigationContainer();
navContainer.AddPage&lt;MainViewPageModel&gt;("Ideas");
navContainer.AddPage&lt;SettingsViewPageModel&gt;("Settings");
MainPage = navContainer;

Podsumowanie

Jak widzicie implementacja nawigacji nie musi być wcale taka trudna bo można to zrobić lekko łatwo i przyjemnie. Niekoniecznie w takiej kolejności. Na chwilę obecną FreshMVVM wysunął się mocno na prowadzenie względem innych framework MVVM.

Ma on wiele zalet, a przede wszystkim jest bardzo lekki ok. 60kb.

Czy wy macie jakieś swoje ulubione framework MVVM? Jaka funkcjonalność jest dla was najfajniejsza?

Czym jest 10Things

Czym jest 10Things? I pierwszy commit

01.03.2017 to ważna data. Tego dnia rozpoczął się konkurs „Daj Się Poznać 2017” i powstał projekt 10Things. O samym konkursie nie będę się już rozpisywał oraz o tym czemu po co na co.

Wydażyła się również inna ważna rzecz, czyli pierwszy commit na GitHub w projekcie 10Things.

Chciałbym natomiast opisać trochę czym jest 10Things, czyli mój projekt, oraz jakich technologii chciałbym użyć.

Czym jest 10Things

10Things to aplikacja mobilna mająca za zadania stymulowanie naszego mózgu :). Dokładniej chce stworzyć produkt do rozwoju naszej kreatywności.

Cała idea jest opisana w książce „Become Idea Machine„. Sam pomysł na napisanie akurat takiej aplikacji został trochę zainspirowany przez Mirka Brunejko (za co mu wielkie dzięki).

Zasada działania samej aplikacji jest bardzo prosta. Każdego dnia będziemy dostawać jakiś losowy problem do „obróbki” na podstawie, którego będziemy wymyślać 10 pomysłów na jego rozwiązanie. Problemy mogą być abstrakcyjne np. „Jak rozwiązać problem głodu na świecie” lub trochę bardziej przyziemne np. „Jak wystartować działalność gospodarczą online w Czechach”.

Ale żeby nie było zbyt prosto to na każdych z tych problemów będziemy musieli wymyślić 10 pomysłów i dodatkowo będziemy mieli liczony czas.

Każdy dzień będziemy mogli później analizować w widoku kalendarza jak i w widoku statystyk. Na początku będzie ciężko ale później powinno być już tylko lepiej.

Rezultat jaki można osiągnąć po stosowaniu takich zabiegów to bardzo mocno rozwinięta pomysłowość.

Skąd się biorą problemy

No dobra dobra Maćku ale skąd się biorą te problem?

Będą je tworzyć ludzie.

Do tego celu powstanie strona przy pomocy, której ludzie będą mogli dodawać swoje pomysły na problem :). Trochę dziwnie to brzmi ale….cóż.

Będzie ona również służyć do głosowania na najlepsze pomysły.

Technologia

To co programiści lubią najbardziej technologia i gadżety :).

Jako, że jest to aplikacja mająca działać na wielu platformach będzie napisana w Xamarin.Forms. Platformami na które będzie dostępna to iOS i Android (nie koniecznie w tej kolejności) na razie nie planuje wersji na Windows.

Na część serwerową pomysł mam następujący

  • NoSQL prawdopodobnie wybór padnie na DocumentDB
  • React jako, że jest jednym z niewielu JS framework, które lubię
  • Docker jako, że od dawna mnie ciągnie w tą stronę. Tylko pytanie czy będzie mi faktycznie potrzebny

Podsumowując plany są duże i ambitne. Teraz pozostaje zakasać rękawy i jak mówi Gary Vaynerchuk

more more more

Lub bardziej po polsku i moja wersja

robić robić robić

 

Daj się poznać 2017

A więc stało się. Daj się poznać 2017 czas zacząć i się zapisać

Daj się poznać 2017 jest drugą trzecią edycją konkursu organizowanego przez Maćka Aniserowicza z DevStyle.pl i ma na celu???
Wyciągnięcie programistów z ich piwnic i wyjście do ludzi/społeczności.

Daj się poznać 2017. Czym jest dla mnie???

Dla mnie jest to niesamowicie ważny krok na który zbierałem się od dawna. Dzisiaj pokonałem swój lęk i przestałem się bać tego, że ktoś wyśmieje to co robię. Kto wie może nauczę się prowadzenia prezentacji i pokonam kolejny lęk 🙂

Czego ja oczekuję???

  • Nauki i poznania naprawdę dobrze Xamarin, WebAPI z .Net Core oraz Docker (przynajmniej tak to sobie wymyśliłem)
  • Zbudowania marki (przy odrobinie szczęścia)
  • Sprawdzenia się

Podsumowanie

W skrócie klawiatura w dłoń koduj koduj i jeszcze raz koduj, a przy odrobinie szczęścia coś z tego będzie :). Największa satysfakcja to sam udział i dotarcie do końca.