[ASP].NET Worst Practices

Podobné dokumenty
[ASP].NET Worst Practices

Robert Haken [MVP ASP.NET/IIS, MCT] software architect, HAVIT, Perly code-review z praxe

Code Contracts. Robert Haken [MVP ASP.NET, MCT] Software architect, Owner at HAVIT, s.r.o. knowledge-base.havit.cz

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

Příklad aplikace Klient/Server s Boss/Worker modelem (informativní)

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 3.4.

Typický prvek kolekce pro české řazení

Zápis programu v jazyce C#

Jazyk C# - přístup k datům

1. Téma 12 - Textové soubory a výjimky

PREPROCESOR POKRAČOVÁNÍ

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 19.2.

IW5 - Programování v.net a C# 4 Pokročilé konstrukce C#

Čipové karty Lekařská informatika

Tabulková data. budeme pracovat s CSV soubory položky oddělené středníkem, např.

Dědičnost (inheritance)

KTE / ZPE Informační technologie

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Jazyk C# (seminář 3)

Jazyk C# - přístup k datům

Vláknové programování část V

RMI Remote Method Invocation

Tomáš Herceg. Microsoft Student Partner Microsoft Most Valuable Professional

Indexové seznamy. známe už pole, kde ale musí být předem známa velikost indexové seznamy umí růst dynamicky

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

PŘETĚŽOVÁNÍ OPERÁTORŮ

Algoritmizace a programování

NIO. Aplikační programování v Javě (BI-APJ) - 12 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Distribuované systémy a výpočty

Ing. Bc. Robert Haken [MVP ASP.NET/IIS, MCT] software architect, HAVIT, Návrh schématu DB

5 Rekurze a zásobník. Rekurzivní volání metody

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Jazyk C# (seminář 5)

ADT/ADS = abstraktní datové typy / struktury

Návrh softwarových systém. Návrh softwarových systémů

Jazyk C# (seminář 6)

Vytváření a použití knihoven tříd

Kolekce, cyklus foreach

Teoretické minimum z PJV

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

Osnova přednášky. Programové prostředky řízení Úvod do C# II. Přístup ke členům. Členy (Members)

Robert Haken [MVP ASP.NET/IIS, MCT] software architect, HAVIT, Základní algoritmy v praxi

ISZR Referenční agent.net

Příkazy a řídicí struktury v Javě. Tomáš Pitner, upravil Marek Šabo

20. Projekt Domácí mediotéka

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.

Jazyk C# a platforma.net

Java - výjimky. private void vstup() throws IOException {... }

Fakulta elektrotechniky a informatiky Univerzita Pardubice 2014/2015. poslední přednáška a materiál k samostudiu

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Ošetřování chyb v programech

Generické programování

Abstraktní datové typy: zásobník

Objekt. základní prvek v OOP. má vlastnosti. má metody. vznikne vytvoření nové instance definován pomocí třídy

PB161 Programování v jazyce C++ Přednáška 8

Java a Caché IV: Manipulace s objekty

Pro kontrolu správného formátu hodnoty N použijeme metodu try-catch.

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

Objekty jako zapozdření dat. začneme vytvářet vlastní objekty a třídy

STŘEDNÍ ŠKOLA PRŮMYSLOVÁ, TECHNICKÁ A AUTOMOBILNÍ JIHLAVA MATURITNÍ PRÁCE

Vlákno odlehčený proces kód vlákna, zásobník privátní ostatní sdíleno s dalšími vlákny téhož procesu

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Používáme pole a kolekce

SOUBORY, VSTUPY A VÝSTUPY

Tvorba informačních systémů

Otázky k teoretické části zkoušky z předmětu IAJCE 2006/2007

Jazyk C# - přístup k datům

Projekty pro výuku programování v jazyce Java

Výjimky. v C# a Javě

Michal Podzimek

8. přednáška: Soubory a proudy

Soubor jako posloupnost bytů

17. Projekt Trojúhelníky

Programování jako nástroj porozumění matematice (seriál pro web modernivyuka.cz)

Třídy a objekty. Třídy a objekty. Vytvoření instance třídy. Přístup k atributům a metodám objektu. $z = new Zlomek(3, 5);

Distribuované systémy a výpočty

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Textové soubory. alg9 1

Práce s textem. Třída Character. Třída Character. Třída Character. reprezentuje objekty zapouzdřující hodnotu typu char (boxing / unboxing)

CMS LARS VIVO VERZE 1.2 Z POHLEDU VIVOJÁŘE

Středoškolská technika 2017 PROGRAM NA GENEROVÁNÍ PRVOČÍSEL

ISZR Referenční agent.net

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Základní pojmy. Matice(řádky, sloupce) Matice(4,6) sloupce

Úvod do programování v jazyce Java

Přehled probírané látky

Regulární výrazy. Vzory

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Kapitola 5 WCF, webové služby a mezidoménové zásady

Seminář z IVT Algoritmizace. Slovanské gymnázium Olomouc Tomáš Kühr

<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC

Class loader. každá třída (java.lang.class) obsahuje referenci na svůj class loader. Implementace class loaderu

Jazyk C# a platforma.net

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

Transkript:

Robert Haken [MVP ASP.NET/IIS, MCT] software architect, HAVIT, s.r.o. haken@havit.cz, @RobertHaken, http://knowledge-base.havit.cz [ASP].NET Worst Practices

SecurityLog

PerformanceTuning DEMO

ResourceManager.cs: private readonly ResourceItem[] items; public string GetResourceString(string key, CultureInfo culture) return items. Where(x => x.equals(new ResourceItem(key, culture))). Select(x => x.text). FirstOrDefault(); ResourceItem.cs public bool Equals(ResourceItem other) if (object.referenceequals(other, null)) return false; return (Key.Equals(other.Key) && LCID.Equals(other.LCID));

private readonly Dictionary<string, string> localizedurls; private string GetUrl(string lang) if (localizedurls.containskey(lang)) return localizedurls[lang]; return "/"; private string GetUrl(string lang) if (localizedurls.trygetvalue(lang, out string url)) return url; return "/"; Proč hledat dvakrát?

<deployment retail="true false"/> machine.config/configuration/system.web machine-wide málo známé, málo používané, málo dokumentované nastavuje debug="false" vypíná výstup do trace vypíná podrobné chyby pro remoteclienty(customerrors)

Sessions DEMO

<compilation debug="true" /> Optimizecode= false batchcompilation = false no request timeout vypínání cachováníwebresources.axd, ScriptResource.axd,... aktivuje debugging-friendlyspecifika unminifiedverze JScriptů, CSS,... #if DEBUGkód větší spotřeba paměti

ASP.NET Overposting / Mass Assignment DEMO

Bug-onlyvýjimky nezachytávejte try DoSomething(); catch (NotImplementedException) // should not happen very often NullReferenceException InvalidOperationException ArgumentException ArgumentNullException...

Re-inventingwheel public static Exception SendAlert(string subject, string body) Exception exceptionout = null; try MailMessage message = new MailMessage(); //... catch (Exception exception) exceptionout = exception; return exceptionout; var ex = SendAlert(subject, body); if (ex!= null) //?? catch (ex) Log(ex);

Kategorie WTF?!

lock(new object()) // thread-safe...vygůgliljsem, že stačí lockna newobject private [static] object mylock = new object(); lock(mylock)...

[Flags] public enum TreeNodeType Normal, Linked, Locked if (t.hasflag(treenodetype.normal)) // WTF? always true! [Flags] vždy s hodnotami, jinak je Normal= 0, Linked= 1, Locked= 2,... [Flags] public enum TreeNodeType Normal = 1, Linked = 2, Locked = 4 // 8, 16,...

Task: Importuj jen druhy 2, 4 a 5 int[] nenacitanedruhy = new int[] 1, 3, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 50, 51, 52, 53, 54 ; if (!nenacitanedruhy.contains(druhzakazky)) // importuj Pozitivní přístup!

DataSet dsresult = new DataSet(); SqlDataAdapter mydataadapter = new SqlDataAdapter( "SELECT COUNT(*) FROM Uzivatel", "**ConnString**"); mydataadapter.fill(dsresult); string count = dsresult.tables[0].rows[0][0].tostring(); dsresult = null; Umím DataSety, tak je používám int count2 = (int)cmd.executescalar();

query.dateto = DateTime.Today.Date;...pro jistotu. // DateTime class public static DateTime Today get return Now.Date;

Code-reviewReq: "Streamvrácený metodou GetMemoryStreamnení disposován" Oprava:...doplněn using

private void Page_Load() // graf s počty přihlášení po dnech za dané období IEnumerable<DateTime> data = LoginLogService.GetListChartLoginLog( DateTime dt = frompicker.selectedvalue; frompicker.selecteddate, topicker.selecteddate); List<LoginStatistic> list = new List<LoginStatistic>(); while (dt <= DateTime.Today) list.add(new LoginStatistic Date = dt, Count = data.where(x => x.date == dt).count() ); dt = dt.adddays(1); MyChart.DataSource = list; MyChart.DataBind(); Výkonová optimalizace! Stačí, když to spočítám do dneška, v budoucnu žádná data přihlášení nejsou.

var posledniradekprojekt = Faktura.Items.Last(o => o.poradi == Faktura.Items.Max(v => v.poradi)).projekt; Poslední z posledních?.last(predicate) // odpovídá.where(predicate).last()

// Kontrola vyplnění RČ a IČ dle právní formy if (akce.dotaceprijemcepravniformatyp == 1) chybaakce = "Pro typ '1' musí být zadáno RČ a nesmí být vyplněno IČ!"; if (akce.dotaceprijemcepravniformatyp == 2) chybaakce = "Pro typ '2' musí být alespoň jedna z položek RČ a IČ vyplněna!"; if (akce.dotaceprijemcepravniformatyp == 3) chybaakce = "Pro typ '3' musí být zadáno IČ a nesmí být vyplněno RČ!"; public enum PravniForma Nepodnikatel = 1, Zivnostnik = 2, PravnickaOsoba = 3 MagicNumbersNEEE! switch (akce.dotaceprijemcepravniformatyp) case PravniForma.Soukromnik: chybaakce = "..."; break; case PravniForma.Zivnostnik: chybaakce = "..."; break; case PravniForma.PravnickaOsoba: chybaakce = "..."; break;

private void GetListForMonth(SqlConnection sqlconnection, int month, int year, Dictionary<string, bool> list) list.clear(); //... while (sqldatareader.read()) list.add(sqldatareader[0].tostring(), true); //... var list = GetListForMonth(conn, 10, 2014, var list = new List<string>(); GetListForMonth(conn, 10, 2014, list);

http://knowledge-base.havit.cz Q & A