Nowoczesne tworzenie projektów w .Net

Post on 15-Jan-2016

24 views 0 download

description

z. z. Nowoczesne tworzenie projektów w .Net. Andrzej „ Siranen ” Piotrowski siranen@gmail.com www.anens.pl UPPoznan.Net User Experiance /Designer. Agenda. Design i Design Pattern jako marka Wzorce Projektowe Design Patterns & Best Practices and Paterns - PowerPoint PPT Presentation

Transcript of Nowoczesne tworzenie projektów w .Net

Andrzej „Siranen”„Siranen” Piotrowskisiranen@gmail.comwww.anens.plUPPoznan.Net

User Experiance/Designer User Experiance/Designer

z

z

Nowoczesne Nowoczesne tworzenie tworzenie projektów w projektów w .Net.Net

Design i Design Pattern jako markaDesign i Design Pattern jako markaWzorce Projektowe Wzorce Projektowe Design Patterns & Best Practices and Design Patterns & Best Practices and

Paterns Paterns A) A) Microsoft Enterprise LibraryMicrosoft Enterprise Library((MGRMGR))*Test-driven development (TDD)*Test-driven development (TDD)B) Model View Presenter (MVP) B) Model View Presenter (MVP) WPFWPFC) Model View ViewModel (MVVM) C) Model View ViewModel (MVVM) WPFWPFD) Model View Controler (MVC)D) Model View Controler (MVC)ASP.NET ASP.NET

MVCMVCPodsumowaniePodsumowanie

AgendaAgenda

Design PatternDesign Pattern

=

SSRP—Single Responsibility PrincipleRP—Single Responsibility Principle OOCP—Open Closed PrincipleCP—Open Closed Principle LLSP—Liskov Substitution PrincipleSP—Liskov Substitution Principle IISP—Interface Segregation PrincipleSP—Interface Segregation Principle DDIP—Dependency Inversion PrincipleIP—Dependency Inversion Principle

SOLIDSOLID

Podziel problem na Podziel problem na mniejsze mniejsze podproblemypodproblemyPodziel podproblemy na Podziel podproblemy na pod-pod-podproblemypodproblemy

public class Operation{    private OperationType type;    public OperationType Type    {        get { return this.type; }    }    private decimal amount;    public decimal Amount    {        get { return this.amount; }        set { this.amount = value; }    }    public Operation (OperationType type)    {        this.type = type;    }}

Klasa powinna być otwarta na rozszerzanie, ale zamknięta na modyfikacje.

public void Execute ( Operation[] operationList ){    for ( int i = 0; i < operationList.Length; i++)    {        Operation operation = operationList[i];        if ( operation.Type == OperationType.Income )        {            ProcessIncome( operation );        }        else if ( operation.Type == OperationType.Outcome )        {            ProcessOutcome ( operation );        }        else if ( operation.Type == OperationType.Transfer )        {            ProcessTransfer( operation );        }    }}

Klasa powinna być otwarta na rozszerzanie, ale zamknięta na modyfikacje.

Klasa powinna być otwarta na rozszerzanie, ale zamknięta na modyfikacje.

public interface IOperation{    void Calculate();}

public void Execute( IOperation[ ] operationList ){    for ( int i = 0; i < operationList.Length; i++ )    {        IOperation operation = operationList[i];        operation.Calculate();    }}

void przetwarzajFigurę(Figura iFigura) { if(typeid(iFigura) == typeid(Prostokąt)) przetwarzajProstokąt(static_cast<Prostokąt>(iFigura)); else if(typeid(iFigura) == typeid(Koło)) przetwarzajOkrąg(static_cast<Okrąg>(iFigura)); else if(typeid(iFigura) == typeid(Kwadrat)) przetwarzajKwadrat(static_cast<Kwadrat>(iFigura)); }

interface IWorkable { public void Work(); } interface IFeedable { public void Eat(); } class Worker: IWorkable, IFeedable { public void Work() { } public void Eat() { } } class Robot: IWorkable { public void Work() { } }

class Bclass B{{public void public void ZrobCos() { }ZrobCos() { }}}

class Aclass A{{public void public void Metoda()Metoda(){{B b = new B();B b = new B();

b.ZrobCos();b.ZrobCos();}}}}

interface IB{void ZrobCos() { }}

class B : IB{public void ZrobCos() { }}

class A{public void Metoda(){IB b = new B();

b.ZrobCos();}}

Co osiągnęliśmy?Co osiągnęliśmy?-odwróciliśmy zależności -odwróciliśmy zależności (wyeliminowaliśmy zależność (wyeliminowaliśmy zależność między abstrakcją a między abstrakcją a szczegółami implementacji)szczegółami implementacji)-klasa A może sterować -klasa A może sterować dowolnymi klasami dowolnymi klasami implementującymi interface implementującymi interface IBIB

Również zasada DIP przydaje Również zasada DIP przydaje się bardzo podczas tworzenia się bardzo podczas tworzenia struktury projektu do struktury projektu do wyeliminowania zależności wyeliminowania zależności między modułami.między modułami.

BudulceBudulce

Świat Microsoftu Świat Microsoftu

Microsoft Enterprise LibraryMicrosoft Enterprise Library

Microsoft Enterprise Library jest to zbiór najlepszych praktyk oraz wzorców projektowych przygotowanych przez grupę specjalistów, które przydają się podczas budowy aplikacji na platformie .net, w wielu samodzielnych bibliotek które dołącza się do projektu w postaci referencji.

Microsoft Enterprise LibraryMicrosoft Enterprise Library

Consistency – Zwiozłość. Zbiór Enterprise Library zawiera bloki które cechuje rozszerzalność modułowa dodając nowe funkcjonalności oraz asocjację z wzorcami projektowymi , umożliwiając korzystanie cały czas z najnowszych porad które są dostarczane w postaci nowszych wersji biblioteki.

Extensibility – Rozszerzalność. Wszystkie bloki mogą być rozbudowywane do celów pod własny projekt, udostępniony kod źródłowy można dowolnie zmieniać i kompilować dodając referencje do projektu.

Integration – Integracyjność. Wszystkie bloki Enterprise Library są tak zaprojektowane aby współdziałały osobno i razem.

Microsoft Enterprise LibraryMicrosoft Enterprise Library

Cryptography Application Block - Blok Kryptografii Aplikacji

Blok zabezpiecza dane przy użyciu algorytmów kryptograficznych. Dane które aplikacja używa mogą być zaszyfrowane. Dodatkowo wszelkie dane dostępowe jak i hasła powinny być chronione hashem. Zabezpieczenia te mogą być wprowadzane poprzez konfigurator dostarczony do biblioteki , unika się styczności z kodem źródłowym.

Microsoft Enterprise LibraryMicrosoft Enterprise Library

Data Access Application Block - Blok Dostępu Do Danych Aplikacji

Blok umożliwia aplikacji czytanie danych do wyświetlenia komunikatu , przekazanie danych do innych warstw aplikacji. Pozwala również na wszelkie operacje bazo danowe z ADO.NET , zarządzanie pytaniami SQL , ustanawianie połączeń z bazą czy obsługę samego procesu przesyłania danych.

Microsoft Enterprise LibraryMicrosoft Enterprise Library

Exception Handling Application Blok - Block Wyjątków Aplikacji

Blok służy do szybkiego i łatwego budowania implementacji strategii w przypadku wyjątków z różnych modułów aplikacji. Może przechowywać informacje z wyjątków, ukrywać ważne dane z wyjątków maskując je innym wyjątkiem czy nadzorować proces pojawiania się wyjątków w czasie działania aplikacji.

Microsoft Enterprise LibraryMicrosoft Enterprise Library

Logging Application Block - Blok Logowania Aplikacji

Blok ten ma zastępować kod odpowiedzialny za odbieranie informacji z logowania. Posiada liczne funkcje logowania takie jak zapisywanie informacji do Windows Event Log, wysyłanie logu za pomocą wiadomości e-mail , zapisu do bazy danych , do Windows Management Instrumentation* (WMI) czy innej wskazanej lokalizacji.

Microsoft Enterprise LibraryMicrosoft Enterprise Library

Validation Application Block - Blok Walidacji Aplikacji

Blok ma za zadanie sprawdzenie czy informacje uzyskiwane od użytkownika są poprawne w obrębie reguł ustanowionych w regułach biznesowych.

Jeżeli występuje błąd, gdyż wpisana nazwa jest błędna , blok ten automatycznie wysyła komunikat do użytkownika. Proste do edycji mechanizmy walidacji korzystające z atrybutów i szeregu zasad umożliwa integracje z różnymi interfaceami aplikacji.

Microsoft Enterprise LibraryMicrosoft Enterprise Library

TDDTDD

1.Napisz test kodu2. Skompiluj test kodu ( oczywiście będzie

błąd gdyż nic nie jest zaimpelemntowane)3. Dopisz resztę implementacji4. Uruchom test i sprawdz czy wystąpi błąd5. Skończy implementacje aby przejść test6.Uruchom test i sprawdz czy działa.7. Korzystając z techniki Refaktoryzacji ,

upraszczaj kod8. Powtarzaj aż do minimalizacji kodu.

TDDTDD

Silverlight i Silverlight i WPFWPF

MVVM , MVPMVVM , MVP

MVVMMVVM

MVC vs MVPMVC vs MVP

Programista „drag and drop” Używa zaawansowanej techniki

programistycznej o nazwie „drag & drop” Najwięcej czasu spędza korzystając z trybu

„design” Programista świadomy

Samodzielnie tworzy ~100% kodu W tym JavaScript

Często walczy z ASP.NET starając się zachować maksymalną kontrolę nad generowanym kodem

Problemem są pewne wstępne założenia, promowane do dziś odnośnie tzw. dobrych praktyk użycia ASP.NET (WebForms w szczególności)

ASP.NET 4.0 stara się pomóc świadomym programistom Nowe (właściwe) podejście do pracy z

ViewState Identyfikatory kontrolek (IDs) Nowe trybu renderingu niektórych kontrolek Kontrola URL XHTML i standardy zwiększające dostępność

stron WWW ASP.NET Ajax – inwestycja w warstwę kliencką ASP.NET MVC - NASZ WZORZEC

ASP.NET 4.0ASP.NET 4.0

Wyłączenie viewstate w web.config

…sprawi, że poniższe ustawienia przestaną działać:

Tak samo ja właściwość ViewStateMode

ViewStateViewState

Możliwe wyłączenie na poziomie np. całej strony i uaktywnianie na poziomie poszczególnych kontrolek

Control.ViewStateMode Enabled Disabled Inherit (ustawienie domyślne, dziedziczymy po

kontrolce nadrzędnej) Możliwość wyłączenia ViewState w

Web.config

ViewStateViewState

Control.ClientIdMode AutoID (jak w starym ASP.NET) Static („manualne” ustawianie ID, ryzyko błędu) Predictable (nowy algorytm przyznawania ID,

możliwość używania z „RowClientIdSuffix”) Inherit (ustawienie domyślne)

Web.config<system.web> <pages clientIdMode="Predictable"> </pages></system.web>

Identyfikatory IDIdentyfikatory ID

Funkcjonalność dostępna w ASP.NET 3.5 SP1, w ASP.NET 4.0 będzie nieco łatwiej…

Request:Products/Bikes

ASP.NET RoutingRoute:

Product/{name} -> Product.aspx

WebForms PageFile Name:

Product.aspxRoute Values:

Name = “Bikes”

Response

Identyfikatory IDIdentyfikatory ID

Przykłady użycia: Kod C#

Kod .aspx

string searchterm = Page.RouteData.Values["searchterm"] as string;label1.Text = searchterm;

<asp:Literal Text="<%$ RouteValue:Category %>" runat="server" />

<asp:EntityDataSource

<WhereParameters>

<asp:RouteParameter

Name="Category"

RouteKey="Category"

Type="String" />

</WhereParameters>

</asp:EntityDataSource>

Identyfikatory IDIdentyfikatory ID

Kontrolka Chart Istnieje w postaci dodatkowego komponentu

już od jakiegoś czasu 35 typów wykresów w tym tryby 3D Zaawansowane formatowanie Funkcje statystyczne Wykorzystanie Ajax i obsługa zdarzeń

Nowa kontrolki: ChartNowa kontrolki: Chart

Kilka nowości…

Kilka usprawnień Wsparcie dla CSS 2.1, lepsze zachowywanie

integralności HTML, lepszy intellisense w JavaScript

Snippets (~200) HTMLdiv, table, img …

ASP.NETscriptmanager, sqldatasource, formview

ASP.NET AJAXbehavior, control …

JavaScriptfunction, forin …

ASP.NET(VS2010)ASP.NET(VS2010)

Wdrażanie (Deployment) Paczki wdrożeniowe (Web packages)

Mogą zawierać: Dodatkowe biblioteki Skrypty SQL Ustawienia Certyfikaty, wpisy do rejestru, biblioteki itd..

Wdrażanie: „Import Application” w IIS 7.0 MsDeploy (np. z linii poleceń, PowerShell, Team Build) Deployment API

Transformacje plików Web.config

ASP.NET(VS2010)ASP.NET(VS2010)

Budowa paczki, zależności Web publishing pipeline

Microsoft.Web.Publishing.targets

ASP.NET(VS2010)ASP.NET(VS2010)

Areas Pozwala zorganizować

większy projekt w obszary (Area).

Każdy taki obszar może reprezentować logiczny moduł takiego projektu, grupując powiązane kontrolery i widoki

ASP.NET(MVC)ASP.NET(MVC)

Wiele więcej… Asynchroniczne kontrolery Bindowanie do danych binarnych Wsparcie dla atrybutów DataAnnotations Lepsza walidacja po stronie klienta Przeciążanie metod HTTP (np. PUT) Lepsze wspracie w Visual Studio

ASP.NET(MVC R2)ASP.NET(MVC R2)

Istnieje kilka cech ASP.NET MVC, które są naprawdę fajne: Pełna i naturalna kontrola nad HTML (w tym IDs

itp.) Łatwość użycia JavaScript frameworks (Jquery, Dojo,

ExtJS) Rozszerzalność i elastyczność (niemal naturalne

wsparcie dla IoC (dependency injection) ) Testowalność – i nie chodzi tu koniecznie o

podejście TDD, ale stary dobry Unit Testing Dla wyjadaczy tradycyjnego „ASP.NET” możliwość

nauczenia się nowych koncepcji, wzorców i podejścia do tworzenia stron WWW

ASP.NET MVC wydaję się być produktem udanym i jego używanie jest naprawdę fajne (casus Entity Framework ;-( )

Co wybraćCo wybrać

Dlaczego ew. warto zostać przy ASP.NET Baza wiedzy („use google before asking dump

questions”) Design Patterns i Guidlines – te które pojawiły się z

ASP.NET MVC zostały dość ostro skrytykowane (Oxite i Kobe)

Baza kontrolek (darmowych i komercyjnych – Telerik, DevExpress)

Ilość gotowych elementów infrastruktury i tzw. features (Membership, Navigation itp) – ich mała ilość drastycznie zmniejsza produktywność. Ich brak oznacza, że jeżeli chodzi o Rapid Development gorszy jest chyba tylko Perl (ale jest przynajmniej Intelisense i debugger). W praktyce musimy wspomagać się zewnętrznymi

komponentami (np. MvcContrib, FluentNHibernate lub L2S, xVal, Castle.*, jQuery) – niska spójność rozwiązania (cohesion)

Słabe wsparcie w Visual Studio Osiągamy efekt w postaci działającej aplikacji, ale

wymagana jest większa wiedza i większy nakład pracy (a uzasadnienie biznesowe?)

Co wybraćCo wybrać

Wokół ASP.NET MVC narosło wiele mitów… „Tylko ASP.NET MVC zapewnia czystą architekturę”

(separation of concerns) To już chyba zależy od programistów? A istniejące już referencyjne architektury? (np.:

Web Client Software Factory) „Tylko ASP.NET MVC zapewnia testowalność”

WatiN, xUnit itp... „Wsparcie dla Jquery”, „Ładne adresy URL” –

c’mon! „Niepoprawny HTML” – to nie wina WebForms tylko

programistów kontrolek ASP.NET to dojrzała, stabilna i sprawdzona

technologia Pamiętajmy że ASP.NET to infrastruktura na

podstawie której zbudowany został również ASP.NET MVC

Co wybraćCo wybrać

Bez „wzorca”Bez „wzorca”

KsiążkiKsiążki