Přednáška: Středa, 15:40, S3 (Pavel Ježek)
Cvičení:
Středa, 10:40, SW2 (Matyáš Brabec)
Středa, 12:20, SW2 (Filip Kliber)
Čtvrtek, 12:20, SW2 (Filip Kliber)
Čtvrtek, 15:40, SW2 (Pavel Ježek)
Stránka v SIS: NPRG038
Zakončení: Zkouška a zápočet
Table of contents
- Náplň přednášek
- Náplň cvičení
- Informace o zkoušce
- Informace o zápočtu
- Uznávání povinností z minulých let
[in English] This page contains information for czech students of the Advanced C# Programming course. For english version, switch the language in the page header.
Náplň přednášek
1. přednáška
- Obecné informace k předmětu a přehled ostatních .NET předmětů, Extended Track přednášky
- Přiřaditelnosti typů, implicitní a explicitní konverze, boxing a unboxing
- Vlastní konverzní funkce, fluent syntax a extension metody
Materiály
2. přednáška
- Přetěžování metod
- Pravidla pro výběr metody za překladu
- Příklady komplikovanějších situací i s konverzemi
- Generické metody (a alternativy; příklad s funkcí
Max
) - Srovnání s generickými metodami v C++ (šablony)
- Pravidla implicitní specializace typových parametrů při volání generických metod
Materiály
3. přednáška
- Připomenutí generických metod (
Max<T>
), překlad generických metod do CIL a generování konkrétních variant JITem a volání různých overloadů - Virtuální generické metody a override, přetěžování metod a komplexní příklad s výběrem metod a konverze
- Implementace generické metody, volání metod a jiná manipulace s argumentem generického typu
- Python duck-typing za runtime a C# duck-typing za překladu (v metodě
Deconstruct
veswitch
výrazů), C++ duck-typing za překladu, C# duck-typing za runtime (pomocídynamic
) where
omezení pro generické metody pomocíinterface
kontraktu, volání generické metody, srovnání s C++- Složení více omezujících podmínek ve
where
klauzuli - Rozdíl mezi generickou metodou s omezením a metodou přijímající interface, boxování
T : IComparable<T>
, generické extension metody- Generické typy, omezení na typové parametry, generování CIL kódu, generický typ v dědičnosti, generická metoda v generickém typu
Materiály
4. přednáška
- Třída implementující více interface se stejnou metodou (kontraktem), problémy a řešení, explicitní implementace interface, interface
IConvertible
- Generický constraint a nejednoznačnost volání metod z různých interface, implementace více generických interface vedoucí na stejnou metodu
- abstraktní statická metoda v interface, použití v generických metodách/typech s
where
klauzulí - statické virtuální metody v interface,
where TSelf : I<TSelf>
jako alternativa kthis
ve statickém kontextu, použití vComplex<T>
aoperator+
,System.Numerics.*
- typová kompatibilita, variance typů, invariantní generické typy, kovariantní pole referenčních typů, invariantní pole hodnotových typů,
ArrayTypeMismatchException
- kovariance virtuálních metody podle návratové metody
Materiály
5. přednáška
- Variance typů, dovysvětlení příkladů z minula, nefunkčnost variance u hodnotových typů
IList<T>
, variance u generických interface referenčních typů,IReadOnlyList<out T>
- explicitní přetypování mezi různými interfaces
- kontravariantní
IComparer<in T>
a další příklady ICollection<T>
,IReadOnlyCollection<out T>
, (obsolete) negenerické interface pro kolekceIEnumerable<out T>
a nefungující implementace aIEnumerator<out T>
(návrhový vzor iterátor), a (obsolete) negenerické varianty- archaická metoda
IEnumerator.Reset
Materiály
5. přednáška [ET]
- Indexování do kolekcí,
readonly struct Index
,readonly struct Range
, metodaSlice
Materiály
6. přednáška
- Jmenné prostory (
namespace
), jména typů - Vnořené typy (nested types), srovnání s Javou, viditelnost vnořených typů
IEnumerable<out T>
,IEnumerator<out T>
, enumerátor jako privátní vnořená třída, sémantika metod enumerátoru,IEnumerator
jakoIDisposable
- concurrent modification a detekce, překlad
foreach
cyklu, hledání vhodnéGetEnumerator
i přes duck-typing - JIT optimalizace procházení pomocí
foreach
, implementaceIEnumerator
jakostruct
a explicitní implementace a nevýhody použití
Materiály
6. přednáška [ET]
- Detailněji o jmenných prostorech, alias,
global::
, alias na knihovnu (extern alias
), importování typů pomocíusing
Materiály
- 06-ET~no.1-NamespacesAndGlobalAlias.zip
- 06-ET~no.2-ConsoleAppWithLibraryAliases.zip
- 06-ET-FilesViaNormalCompressionMethod.zip
- 06-ET-FilesViaStoreMethod.zip
7. přednáška
- Motivace pro enumerátory a příklad implementace enumerátoru u složitějšího typu
- iterátorové metody,
yield return
a implementace iterátorových metod a generovaných enumerátorů (a metodyMoveNext
),yield break
- lazy evaluace, eager evaluace a příklady, procházení
LinkedList
, nekonečné kolekce
8. přednáška
- iterátorová metoda vracející
IEnumerable
a překlad a optimalizace. Vyhazování výjimky z iterátorové metody - Reflection,
Type
,typeof
,object.GetType
,Assembly
,MemberInfo
- python-like duck-typing implementovaný pomocí reflection, overhead volání metod pomocí reflection
- serializace objektů,
JsonSerializer
8. přednáška [ET]
- využití reflection pro implementací plug-inů,
Activator.CreateInstance
, atributy a použití
Doporučená literatura
- Mark Michaelis with Eric Lippert: Essential C# 5.0, Addison-Wesley, 2013 (lze koupit např. na Amazon UK)
- Jeffrey Richter: CLR via C# (4th Edition), Microsoft Press, December 2012 (lze koupit např. na Amazon UK)
- Jon Skeet: C# in Depth (4rd Edition), Manning Publications, September 2013 (lze koupit např. na Amazon UK)
- blog Erica Lipperta (bývalý člen C# týmu v Microsoftu): Fabulous Adventures In Coding
- C# Language Specification version 8
Případně
- Christian Nagel, Evjen, Jay Glynn, Karli Watson, Morgan Skinner: Professional C# 4.0 and .NET 4, Wrox, John Wiley & Sons, March 2010 (lze koupit např. na Amazon UK
Náplň cvičení
0. cvičení
- (nulté cvičení, jelikož není zadaný domácí úkol)
- Úvodní cvičení, požadavky na splnění předmětu. Informace o požadavcích na splnění předmětu jsou k dispozici taky na této stránce.
- Maďarská notace (
int row_a
vs.int int_a
) struct Row
,struct Col
(analýza paměti a rychlosti přístupu k fieldu/vlastnosti, inlining, sharplab.io)- extension metody a hodnotové typy, volání instančních metod hodnotového typu, tracking reference a
ref this
extension metoda, příklad DateOnly
vsDateTime
vs vlastníDate
+ extension metody- nápad na použití fluent syntax ve fyzikálním engine
1. cvičení
- Implicitní vs explicitní konverze, ztráta přesnosti, náročnost operace
- Konverze mezi
struct Fraction
adouble
explicitně, implicitně a algoritmus (příklad) - Konverze mezi
struct Fraction
aint
pro účely metodyFraction Add(Fraction f1, Fraction f2)
a alternativní přístup pomocí přetížení metodyAdd
- Řetězení implicitních (uživatelských i jazykových) konverzí, výběr přetížené metody, příklad
- Nejednoznačnost výběru konverze, explicitní volání implicitního konverzního operátoru, generování volání funkce do CIL, příklad
- Přetěžování aritmetických, relačních a jiných operátorů, best practices pro uživatelsky definované operátory, slidy
- Domácí úkol:
01-Physics
, v GitLabu
2. cvičení
- Rozdíl mezi
void f(IInterface i)
avoid f<T>(T t) where t : IInterface
, řešení kdy je vyžadováno více interfaces a případný zásah do typového systému, (příklad) - Zkoumání paměti předchozího řešení (příklad)
- Pokus o přetížení generické metody pouze podle
where
omezení, a jiné (nefungující) alternativy řešení: - Domácí úkol:
02-FluentPanels
, v GitLabu
3. cvičení
- Komentáře k
01-Physics/PhysicsUnitsLib
: Pojmenování typů, konverze, nevhodnost generické jednotky, nevhodnost generických extension metod, duplikace kódu, benchmark na rozdíl meziclass
/struct
jako wrapper nad double - Komentáře k
01-Physics/JumpingPlatformGame
:class
/struct
, sdílení kódu mezi vertikálním a horizontálním pohybem, possible solution - Komentáře k
02-FluentPlanels
: typová hierarchie, sdílení kódu, vytáhnutí do protected API (a proč ne public),List<Control>
v obecnémPanel
a alternativní řešení s menším/větším overhead, generickýPanel
, fluent syntax, possible solution - Domácí úkol:
03-ImmutablePeople
, v GitLabuPerson
,Teacher
,Student
: immutable typy (modifikace pomocíWith*
=> vytvoření nové instance)List<Student>.WithPasswordResetByFirstName
může vracetList<Person>
(aleList<Student>
by bylo lepší).
- Možnosti omezení generických typů v klauzuli
where
, slides
4. cvičení
- Komentáře k řešení
03-ImmutablePeople
, různé alternativy, korelace s návrhovým vzorem Builder, využití kovariance dle návratové hodnoty virtuální metody - Řešení vyrábění nových instancí pomocí klonování a jiné přístupy
- Použití
List
vs.IList
vs.IReadOnlyList
vs.IEnumerable
u extension metod listu a případná generičnost - Kód
- Domácí úkol:
04-FixedPoint
, v GitLabu
5. cvičení
- Komentáře k řešení
04-FixedPoint
, motivace pro efektivní a paměťově kompaktní implementaci, imutabilita, implementace operátorů, využití features jazyka C# pro dokumentaci, možné řešení - Lepší řešení metody
SumAll<T>(this IEnumerable<T> enumerable)
z přednášky - Připomenutí interfaces
IEnumerable<T>
,I(ReadOnly)Collection<T>
,I(ReadOnly)List<T>
, příklad - Domácí úkol:
05-Validators
, v GitLabu
Informace o zkoušce
Zkouška probíhá primárně písemnou formou, a v každé zkouškové písemce je kolem 6 až 8 otázek (některé obsahují podotázky). U každé otázky, případně podotázky, je dole uvedeno, jaký maximální počet bodů (=N
) lze za správně odpovězenou otázku/podotázku získat: N
bodů získáte v případě, že je odpověď na otázku správně; 0,5 * N
bodu získáte, pokud odpověď není zcela kompletní, ale jinak je správná (tj. nějaká malá část odpovědi chybí nebo je nepřesná); v ostatních případech získáte 0
bodů (tj. pokud v odpovědi chybí větší část, nebo je odpověď na otázku plně nebo i jen z části nesprávná).
Celkem lze z každé písemky získat maximálně 10
bodů. Mapování získaných bodů na výslednou známku je následující:
Body z písemky | Výsledná známka |
---|---|
10 – 8,5 | 1 |
8 – 6,5 | 2 |
6 – 5 | 3 |
4.5 – 0 | 4 |
Každá zkoušková písemka trvá 150 minut, tj. ideálně 20 minut na každou otázku + 30 minut bezpečnostní rezerva. Po písemné části následuje ústní část, kde zkoušející se studentem prochází jeho písemku, a případně nepřesností/nejasností u některých odpovědí se ptá na doplňující otázky — na základě toho je určeno finální bodové hodnocení každé otázky. Základem hodnocení je ale vždy písemná část, tedy u otázky bez odpovědi nebo se špatnou odpovědí nelze ani po ústní části získat více než 0 bodů.
Níže budou pro ilustraci uvedena zadání vybraných písemek z již proběhlých termínů:
Doplňkové informace o zkoušce
Kromě informací uvedených ve slidech z první přednášky navíc pro zkoušky z NPRG035, NPRG038, a NPRG057 platí následující 2 body:
- Pokud někdo bude zapsán na nějakém z termínů zkoušky a na termín se nedostaví, bude mu tento termín v SISu označen jako propadlý (tj. student přijde o jeden pokus). Cílem tohoto opatření je optimalizace vytíženosti jednotlivých termínů, aby všichni studenti měli možnost přijít až na 3 termíny zkoušky.
- Pokud někdo na zkoušce získá známku 2 nebo 3 a bude si chtít svůj výsledek zlepšit, může explicitně na místě během vyhodnocení zkouškové písemky požádat zkoušejícího o nezapsání známky. Zkušební termín mu pak bude v SISu označen jako propadlý. Takový student může pak později
- požádat o dodatečné zapsání získané známky, nebo
- přijít na jiný termín zkoušky (jakýmkoliv výsledkem této “opravné” zkoušky se ovšem anuluje předchozí získaná známka).
Modelový příklad 1:
Student X získá na 1. termínu známku 2 a odmítne ji. Na 2. termínu získá známku 3 a odmítne ji. Na 3. termínu získá známku 1.
Aktuální stav studenta X: 1. termín = propadlý, 2. termín = propadlý, 3. termín = 1, tj. student X zkoušku splnil s hodnocením 1.
Modelový příklad 2:
Student Y získá na 1. termínu známku 3 a odmítne ji. Na 2. termínu získá známku 4.
Aktuální stav studenta Y: 1. termín = propadlý, 2. termín = 4, tj. pokud chce zkoušku splnit, musí student Y přijít na 3. termín. Pokud na 3. termínu opět získá známku 4, tak zkoušku nesplnil.
Modelový příklad 3:
Student Z se nedostaví na 1. termín, na 2. termínu získá známku 3 a odmítne ji, na 3. termínu získá známku 4.
Aktuální stav studenta Z: 1. termín = propadlý, 2. termín = propadlý, 3. termín = 4, tj. student Z zkoušku nesplnil.
Informace o zápočtu
Pro získání zápočtu je nutné dvě podmínky:
1. Domácí úkoly
Během semestru bude zadáno několik (10-12) domácích úkolů. Náročnost těchto úkolů se může různit. Za správné vypracování úkolu dostane student značku OK
. Pokud se v řešení vyskytnou nějaké problémy (např. chybějící implementace nějaké malé části úkolu), dostane student značku OK-
. Naopak, pokud bude řešení velmi kvalitní nebo jinak nadstandardní, dostane student značku OK+
. Kladné značky umí odmazávat mínuska u negativních značek. Pro splnění této podmínky je nutné získat alespoň 5 značek OK
, z nichž alespoň 2 jsou na téma více-vláknového programování; nebo alespoň 1 na více-vláknové programování a alespoň 1 na dobrovolné pokročilé (extended track) koncepty. Domácí úkoly se hodnotí individuálně. Pokud si nejste celkovým hodnocením jistí (např. máte nemálo značek OK-
), zeptejte se svého cvičícího.
Každá další značka OK
nad 5 přidává +0.25 bodů ke zkoušce
Upozornění: Domácí úkoly jsou samostatnou prací, jejímž cílem je zhodnotit schopnost studenta samostatně vypracovat složitější program v jazyce C#. Pokud bude zjištěno, že některý student odevzdal cizí řešení (např. několik studentů odevzdalo různé instance stejného řešení některého domácího úkolu, apod.), bude to považováno za pokus o podvod. Všichni takoví studenti nesplní předmět NPRG038 v tomto akademickém roce a případně bude disciplinární komisi UK MFF doporučeno jejich vyloučení ze studia!
2. Zápočtový program
Termíny:
- Specifikace: 11. 7. 2025
- Předvedení finální plně funkční verze (včetně uživatelské a programátorské dokumentace):
-
- deadline: 8. 8. 2025
-
- deadline: 5. 9. 2025
-
Jeden zápočtový program může být použit pro splnění povinností z vícero předmětů o C#, pokud je program dostatečně rozsáhlý.
- Požadavky pro NPRG035 + NPRG038:
- Předvedeno do 1. deadline: minimálně 45 kB zdrojového kódu v jazyce C#
- Předvedeno do 2. deadline: minimálně 60 kB zdrojového kódu v jazyce C#
- Předvedeno po 2. deadline: minimálně 90 kB zdrojového kódu v jazyce C#
Zdrojové kódy musí být ručně psané (nevygenerované) a rozumné, včetně rozumných komentářů.
Zápočtový program vyžaduje rozumné a netriviální použití nějakých technologií probíraných na přednáškách a cvičeních (např. vlastní operátory, variantní rozhraní, delegáti, vlákna, síťování, LINQ, reflection, generování kódu).
Osobní předvedení je součástí odevzdání. Na předvádění si připravte několik slides shrnujících hlavní funkce programu, hlavní řešené problémy a nástin architektury.
Uznávání povinností z minulých let
Pokud jste tento předmět měli zapsaný loňský akademický rok a splnili jste pouze některé z povinností potřebných pro udělení zápočtu, může vám je po explicitním požádání (např. při předvádění zápočtového programu) uznat váš letošní cvičící (lze uznat splněnou docházku, domácí úkoly, zápočtový test, odevzdaný a schválený zápočtový program). Téma zápočtového programu (pokud ho ještě nemáte dokončený) nemusí být novým cvičícím uznáno. Pokud jste v loňském roce úspěšně složili zkoušku, ale nepodařilo se vám získat zápočet, opět po explicitním požádání vám může zkoušku uznat Pavel Ježek. Toto je iniciativa vyučujících tohoto předmětu a nelze ji požadovat po studijním oddělení!