Pokročilé techniky programování .NET a C#

Post on 08-Jul-2015

1,047 views 4 download

transcript

přednáška 03

Fakulta elektrotechniky a informatikyUniverzita Pardubice2012/2013

Ing. Jan Hřídel (@h0nza)◦ jan.hridel@upce.cz

◦ 466 037 178

◦ kancelář: 03 012

◦ www.hridel.com

@h0nza

Nejvyšší úroveň◦ Váš kód vás přežije

Dijkstra Knuth Kay

No comment ;)The Art of Commputer

Programming

TeX

OOPWindowing GUI

Světově známí a vybudovali úspěšný byznys◦ The real freedom zero

Carmack Hansson Gates

Doom | Quake | … RoR | 37 Signals No comment ;)

Známí v programátorských kruzích◦ Slavný je dobrý, ale úspěšný je lepší

Většinou pracují pro velké a dobře známé korporace nebo jsou členy startup týmů

Úspěšná kariéra softwarových vývojářů

Výborné skills◦ Nemají problém sehnat práci

◦ Firmy je berou „všema deseti“

Ale co dál? Kam se odtud posunout?

Dost dobrý programátor, který ale není vynikající programátor◦ A možná ani nikdy nebude

◦ Většinou chybí talent na kódování

Rádi kódují

Ukazují své projekty

Věnují programování hodně volného času

Mohou se rychle přesunout do skupiny pracujících programátorů

Typický programátor – Jan Kodér

Obvykle pracuje v rámci velké „anonymní“ společnosti

Programování je jejich práce, ne „celý jejich život“

Spadli do programátorské role ani nevědí jak.◦ A to bez předchozích znalostí a zkušeností

Vše, na co sáhnou, se stává utrpením pro ostatní spolupracovníky (programátory) –možná s výjimkou jiných špatných programátorů.

Bez rostoucího nadšení to bude zas jen rutina a

práce

Je to vždy vaše chyba!

Nejlepší kód je „žádný“ kód!

http://goo.gl/87XHC

Nejlepší kód je „žádný“ kód!◦ Jako softwaroví vývojáři jste svým vlastním

nejhorším nepřítelem.

Nejlepší kód je „žádný“ kód!◦ Kód lze hodnotit z mnoha úhlů pohledů:

Stručnost

Plná funkcionalita

Rychlost

Čas strávený kódováním

Robustnost

Flexibilita

if (s == String.Empty) vs. if (s == “”)

Komentáře!◦ Ne co

◦ Ne jak

◦ Ale proč

„to write good comments you have to be a good writer“

Dodržujte konvence!

Pascal casing◦ První písmeno každého slova velkým písmenem◦ Nepoužívají se podtržítka DruhaMocnina

◦ Pro většinu identifikátorů

Camel casing◦ První písmeno malé; druhé a další slova začínají

velkým písmenem. druhaMocnina

◦ Parametry metod, lokální proměnné, soukromé datové složky třídy

Prostory jmen◦ Hlavní namespace – název společnosti

◦ Vnořený namespace – název projektu (aplikace)

Názvy identifikátorů se uvádějí bez prefixu◦ Kromě rozhrání s prefixem I, např. Idisposable

◦ Například název třídy by neměl být CDog nebo TDog, ale jen Dog

Zkratky a akronymy◦ Malými písmeny – první znak však závisí na typu

identifikátoru

htmlControl – pro soukromé složky

HtmlControl – pro ostatní složky

◦ Výjimka – dvouznaké zkratky jsou velkými písmeny

kromě těch, které jsou na začátku identifikátoru a mají být psány velbloudím stylem

DBCommand – veřejná složka

dbCommand – soukromá složka

V .NET není pevně dodrženo (DbConnection)

Více viz MSDN knihovna a téma„Guidelines for Names“

http://goo.gl/179I1

Posloupnost písmen a číslic začínající písmenem.◦ „Písmeno“ – jakýkoliv znak

z UNICODE

Rozlišují se malá a velká písmena

Na začátek lze přidat znak @◦ @do vs. do

Klíčové slovo

Vždy malým písmenem

http://goo.gl/8Di7A

Modifikátory(nep) typ identifikátor inicializace(nep)

◦ Modifikátory

const

volatile

◦ Typ – typ proměnné

◦ Identifikátor – jméno proměnné

◦ Inicializace – inicializační část

There areNO GLOBAL

variables in C#

Příklady

int i, j = 11, k = 5;

const int m = 10, n = 20;

n je také konstanta

Rozdíly oproti C++◦ Modifikátor const lze použít pro předdefinované

(základní) datové typy. U referenčních typů (třídy) jej lze použít pouze tehdy, pokud je proměnná inicializována hodnotou null.

◦ Překladač nedovolí použít proměnnou jež nebyla inicializována.

◦ Ve vnořeném bloku nelze deklarovat proměnnou stejného jména jako v bloku nadřezeném.

Rozdíly oproti C++

◦ Mezi prostorem jmen a identifikátorem a mezi vnořeným a nadřazeným prostorem jmen se uvádí tečka.

◦ Pro složky prostorů jmen lze uvést přístupová práva.

Deklaracenamespace jméno { direktiva_using(nep)

deklarace_složek }

◦ jméno – název prostoru jmen

◦ direktiva_using – direktiva using (viz dále)

◦ deklarace_složek – deklarace datových typů (tříd, struktur, výčtových typů, …)

Deklarace vnořeného prostoru jmen◦ Způsob 1

namespace Vnější

{

namespace Vnitřní

{

class X {}

}

}

Deklarace vnořeného prostoru jmen◦ Způsob 2 (v C++ neexistuje)

namespace Vnější.Vnitřní

{

class X {}

}

V obou případech se mimo prostor jmenk X přistoupí způsobem Vnější.Vnitřní.X

Přístupová práva◦ public – datový typ je veřejně přístupný, lze jej

použít i v jiných sestaveních

◦ internal – datový typ lze použít pouze v sestavení, ve kterém je deklarován

internal je výchozí – automaticky doplněno překladačem, pokud není specifikováno jinak

Syntaxe deklarace◦ using jméno_prostoru_jmen;

◦ using alias = jméno_prostoru_jmen;

◦ using alias = jméno_typu;

Direktiva using musí předcházet všem deklaracím v prostoru jmen.

Syntaxe deklarace◦ using jméno_prostoru_jmen;

Slouží k specifikaci prostoru jmen, jehož identifikátory se nemusí v programu klasifikovat jménem tohoto prostoru.

Při použití using System; lze psát rovnouConsole.Writeline(); protože Console je součástí prostoru jmen System.◦ Nelze však psát File.Create(“data.txt“); ani

IO. File.Create(“data.txt“);

PROČ?

Syntaxe deklarace◦ using jméno_prostoru_jmen;

Slouží k specifikaci prostoru jmen, jehož identifikátory se nemusí v programu klasifikovat jménem tohoto prostoru.

Při použití using System; lze psát rovnouConsole.Writeline(); protože Console je součástí prostoru jmen System.◦ Nelze však psát File.Create(“data.txt“); ani

IO. File.Create(“data.txt“);

PROČ?File leží v prostoru jmen System.IO, a ten není

direktivou usingzpřístupněn.

Syntaxe deklarace◦ using alias = jméno_prostoru_jmen;

Slouží k jinému pojmenování existujícího prostoru jmen.

alias – nové jméno prostoru jmen

jméno_prostoru_jmen – původní označení prostoru jmen

using VV = Vnější.Vnitřní;

Ke složce X pak lze přistoupit přes: VV.X.

Syntaxe deklarace◦ using alias = jméno_typu;

Slouží k nového jména pro daný typ.

alias – nové jméno typu

jméno_typu – původní označení typu

using VVX = Vnější.Vnitřní.X;

Nelze přejmenovat klíčové slovo:◦ using cela = int;

Lze však napsat:◦ using cela = System.Int32;

Typ int je jiné označení pro

Int32 v prostoru jmen System

Obdoba typedefz C++

namespace alias qualifier

Používá se ve spojení s klíčovým slovem global nebo ve spojení s aliasem prostoru jmen.

global lze využít ke zpřístupnění složkyz globálního prostoru jmen, která je zastíněna

jiným jmenným prostorem.

Obdoba unárního rozlišovacího operátoru ::z C++

namespace GlobalniProstorJmen

{

class System { }

class Program

{

static void Main(string[] args)

{

System.Console.WriteLine("Text");

global::System.Console.WriteLine("Text");

global::System.Console.ReadKey();

}

}

}

V C# je rozdíl mezi strukturami a třídami o poznání větší než v C++.

Syntaxe◦ Modifikátor(nep) struct jméno specifikace_rozhraní(nep) {

složky(nep) } ;(nep)

modifikátor – přístupová práva.

jméno – identifikátor datového typu dané struktury, který tato deklarace zavádí.

specifikace_rozhraní – rozhraní, která tato struktura implementuje (viz dále).

složky – seznam složek struktury (datové složky, metody, přetížené operátory, konstruktory, vlastnosti, události a vnořené typy).

Rozdíly mezi třídami a strukturami

◦ Struktury patří mezi hodnotové typy, třídy mezi referenční typy. Hodnotové typy se vytvářejív zásobníku, referenční na haldě.

◦ Všechny struktury jsou potomkem třídy System.ValueType, která je odvozena od třídy object. V deklaraci nelze specifikovat předka a od struktury nelze odvodit potomka.

Rozdíly mezi třídami a strukturami

◦ Struktury nemohou mít destruktor.

◦ Struktury nemohou mít uživatelem definovaný konstruktor bez parametrů.

◦ Konstruktor struktury musí inicializovat všechny její datové složky.

Překladač automaticky vytváří implicitní konstruktor, který inicializuje všechny datové složky na hodnotu 0, false nebo null.

Vytvoření instance◦ Pomocí operátoru new◦ Inicializací všech datových složek struktury

struct Bod

{

public double x, y;

public Bod(double x, double y)

{

this.x = x;

this.y = y;

}

}

Vytvoření instance◦ Bod a = new Bod();

◦ Bod b = new Bod(30, 40);

K jednotlivým datovým

složkám lze přistoupit přes

tečku(a.x, a.y, b.x, b.y).

Jaké budou jejich hodnoty?

Vytvoření instance◦ Bod a = new Bod();

◦ Bod b = new Bod(30, 40);

a.x = 0, a.y = 0

b.x = 30, b.y = 40

Identifikátorya, b nejsou ukazatelé.

Operátor new u struktury

nepředstavujedynamickou alokaci

paměti.

Jedná se o instance.

Bod c;

c.x = 10;

c.y = 20;

int v = c.x + c.y;

Nevolá se konstruktor.

Složky lze inicializovat samostatně

OK

Think about your users and

their needs before you start

building the code, and they’ll

be happy with the final

product once you’re done!