Nowoczesne tworzenie projektów w .Net

47
Andrzej „Siranen” „Siranen” Piotrowski [email protected] www.anens.pl UPPoznan.Net User Experiance/Designer User Experiance/Designer z z Nowoczesne Nowoczesne tworzenie tworzenie projektów projektów w .Net w .Net

description

z. z. Nowoczesne tworzenie projektów w .Net. Andrzej „ Siranen ” Piotrowski [email protected] 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

Page 1: Nowoczesne tworzenie projektów w .Net

Andrzej „Siranen”„Siranen” [email protected]

User Experiance/Designer User Experiance/Designer

z

z

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

Page 2: Nowoczesne tworzenie projektów w .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

Page 3: Nowoczesne tworzenie projektów w .Net

Design PatternDesign Pattern

=

Page 4: Nowoczesne tworzenie projektów w .Net

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

Page 5: Nowoczesne tworzenie projektów w .Net

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

Page 6: Nowoczesne tworzenie projektów w .Net

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.

Page 7: Nowoczesne tworzenie projektów w .Net

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.

Page 8: Nowoczesne tworzenie projektów w .Net

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();    }}

Page 9: Nowoczesne tworzenie projektów w .Net

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)); }

Page 10: Nowoczesne tworzenie projektów w .Net

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() { } }

Page 11: Nowoczesne tworzenie projektów w .Net

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();}}}}

Page 12: Nowoczesne tworzenie projektów w .Net

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.

Page 13: Nowoczesne tworzenie projektów w .Net

BudulceBudulce

Page 14: Nowoczesne tworzenie projektów w .Net

Świat Microsoftu Świat Microsoftu

Page 15: Nowoczesne tworzenie projektów w .Net

Microsoft Enterprise LibraryMicrosoft Enterprise Library

Page 16: Nowoczesne tworzenie projektów w .Net

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

Page 17: Nowoczesne tworzenie projektów w .Net

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

Page 18: Nowoczesne tworzenie projektów w .Net

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

Page 19: Nowoczesne tworzenie projektów w .Net

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

Page 20: Nowoczesne tworzenie projektów w .Net

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

Page 21: Nowoczesne tworzenie projektów w .Net

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

Page 22: Nowoczesne tworzenie projektów w .Net

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

Page 23: Nowoczesne tworzenie projektów w .Net
Page 24: Nowoczesne tworzenie projektów w .Net

TDDTDD

Page 25: Nowoczesne tworzenie projektów w .Net

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

Page 26: Nowoczesne tworzenie projektów w .Net

Silverlight i Silverlight i WPFWPF

MVVM , MVPMVVM , MVP

Page 27: Nowoczesne tworzenie projektów w .Net

MVVMMVVM

Page 28: Nowoczesne tworzenie projektów w .Net

MVC vs MVPMVC vs MVP

Page 29: Nowoczesne tworzenie projektów w .Net

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)

Page 30: Nowoczesne tworzenie projektów w .Net

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

Page 31: Nowoczesne tworzenie projektów w .Net

Wyłączenie viewstate w web.config

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

Tak samo ja właściwość ViewStateMode

ViewStateViewState

Page 32: Nowoczesne tworzenie projektów w .Net

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

Page 33: Nowoczesne tworzenie projektów w .Net

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

Page 34: Nowoczesne tworzenie projektów w .Net

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

Page 35: Nowoczesne tworzenie projektów w .Net

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

Page 36: Nowoczesne tworzenie projektów w .Net

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

Page 37: Nowoczesne tworzenie projektów w .Net

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)

Page 38: Nowoczesne tworzenie projektów w .Net

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)

Page 39: Nowoczesne tworzenie projektów w .Net

Budowa paczki, zależności Web publishing pipeline

Microsoft.Web.Publishing.targets

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

Page 40: Nowoczesne tworzenie projektów w .Net

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)

Page 41: Nowoczesne tworzenie projektów w .Net

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)

Page 42: Nowoczesne tworzenie projektów w .Net

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ć

Page 43: Nowoczesne tworzenie projektów w .Net

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ć

Page 44: Nowoczesne tworzenie projektów w .Net

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ć

Page 45: Nowoczesne tworzenie projektów w .Net

Bez „wzorca”Bez „wzorca”

Page 46: Nowoczesne tworzenie projektów w .Net

KsiążkiKsiążki

Page 47: Nowoczesne tworzenie projektów w .Net