C# deel 2 csharp

Philip van Oosten   vanoosten.be

syntra

2019-2020

Doelstellingen

Doelstellingen van dit jaar

Individuele doelstellingen: in de loop van het jaar slagen voor opdrachten ivm

  • herhaling eerste deel (10)
  • architectuur(10)
  • LINQ en lambda (10)
  • ado.net/entity (10)
  • Unit testing (10)
  • ASP.net (20)
  • REST (10)

Doelstellingen van dit jaar

Eindwerk (groepswerk)

  • Met de volledige groep samenwerken in 1 repository.
  • In kleine groepjes delen van dit project voltooien.
  • Het volledige project uitvoerbaar maken. Proberen alles bij elkaar te laten passen. Zit er een projectmanager verscholen in enkelen van jullie? Kunnen jullie zowel in kleinere als grotere groepen samenwerken?

Eindwerk

Thema

Een schrijnwerker wil uitgroeien tot een fabriek en zijn creaties online verkopen. Klanten kunnen hun geconfigureerde bouwpakketten laten leveren of door een vakman ter plaatse in elkaar laten zetten.

Er is software nodig om dat alles mogelijk te maken.

Attitude

Niet alles voorgekauwd → zelf vanalles uitzoeken, installeren, documentatie lezen.

Vraag op tijd om hulp.

Je wordt verwacht 2 avonden per week bezig te zijn met de opleiding.

We gaan een versnelling hoger dan vorig jaar. De meesten zullen een tandje bij moeten steken.

Tools of the trade

Programmeeromgeving

Te installeren met Visual Studio Installer

Bij Workloads:

  • .NET Core cross-platform development
  • ASP.NET and web development

Bij Individual Components moet je zeker terugvinden:

  • SQL Server Data Tools
  • NuGet package manager
  • Testing Tools Core Features

Command line interface (CLI)

Enkele basiscommando’s moet je kennen.

We gebruiken PowerShell als CLI, omdat die op verschillende plaatsen geïntegreerd is in de programmeeromgeving.

PowerShell kan je ook als REPL voor .NET gebruiken.

Controle

Volgende commando’s moet je kunnen uitvoeren op de command line:

  • git voor versiebeheer
  • dotnet om te werken met .NET Core
  • code om vscode te openen

Documentatie

Microsoft Docs

ASP.NET Core documentatie

Basis C#

Oefeningen

Documentatie

Class view gebruiken

Opdracht herhaling C# 1

Er volgt een opdracht gelijkaardig aan de oefening in onderstaande slides.

Oefening

  • Onderstaande slides beschrijven een model dat je moet implementeren. Probeer ervoor te zorgen dat je zowel een WPF- als een console-applicatie voor hetzelfde model zou kunnen maken.
  • Maak een REPL console-applicatie om met het model te werken
  • Maak een WPF-applicatie met MVVM om met het model te werken

Oefening Kamers 1/11

Implementeer het model dat hieronder is beschreven.

Implementatie van een objectmodel in C#.

Gebruik een .NET Standard 2.0 class library.

Oefening Kamers 2/11

Er zijn spelers, kamers of plaatsen, voorwerpen en tenslotte zijn er deuren of doorgangen. Spelers kunnen opdrachten of queestes uitvoeren.

Oefening Kamers 3/11

In eerste instantie hou je maar rekening met 1 speler tegelijk. Uiteindelijk zullen er meerdere spelers tegelijk het spel kunnen spelen. Wat doe je daarmee? Is interactie tussen spelers mogelijk?

Oefening Kamers 4/11

Op een plaats kunnen zich voorwerpen bevinden. Sommige voorwerpen zitten vast op een plaats (bv een standbeeld, een lichtschakelaar, …) en sommige kan je meenemen (bv een afstandsbediening).

Oefening Kamers 5/11

Met sommige voorwerpen kan je iets doen. Als dat zo is, kan je zien aan het voorwerp wat ermee kan gedaan worden. Bv van een cijferslot kan je de combinatie veranderen. Een schakelaar kan je aan- en uitzetten, … Soms kan je alleen maar zien wat de status van een object is (een lamp is aan of uit).

Oefening Kamers 6/11

Sommige voorwerpen komen na een tijdje terug. Als je er eentje in je rugzak hebt gestopt, staat er over 10 minuutjes of als je ver genoeg bent weggelopen een nieuwtje. Andere voorwerpen zijn uniek. Als je met meerder spelers werkt, zijn er voorwerpen die per speler verschillen, zodat elke speler alle queestes kan vervullen, ook al heeft een andere speler een object bij zich dat daarvoor nodig is.

Oefening Kamers 7/11

Spelers kunnen opdrachten of queestes uitvoeren. Met die opdrachten kunnen ze hun score verhogen of geld verdienen, afhankelijk van hoe je het wil noemen in je spel. Een queeste bestaat uit een reeks acties die al dan niet in een bepaalde volgorde moeten uitgevoerd worden. Door een queeste uit te voeren verander je de staat van objecten van verschillende soorten, totdat die allemaal de gewenste staat hebben waarmee een queeste wordt beëindigd.

Oefening Kamers 8/11

Een speler kan zich via een doorgang bewegen van de ene plaats naar de andere. Een speler kan zich altijd maar op 1 plaats tegelijk bevinden. Soms is het nodig dat een bepaalde voorwaarde moet voldaan zijn. Een bepaalde queeste moet al eens vervuld zijn, of de speler moet een bepaalde sleutel bij zich hebben. Mogelijk heb je nog andere ideeën om toegang door bepaalde doorgangen mogelijk te maken.

Oefening Kamers 9/11

Een speler kan voorwerpen bij zich houden. De speler kan zijn voorwerpen in een ruimte leggen of voorwerpen uit een ruimte in zijn rugzak stoppen.

Oefening Kamers 10/11

Het spel moet kunnen aangepast worden, zodat je de volgende keer dat je het spel opnieuw begint, in een andere omgeving zit of dat er iets is toegevoegd.

Oefening Kamers 11/11

Het spel moet kunnen opgeslagen en opnieuw ingeladen worden, zodat je kan stoppen met spelen en een andere keer doordoen. Maak de manier van opslaan abstract. Implementeer alleen maar een mock.

Implementatie “kamers” model in C#

Visual Studio tips

Snippets

Snippet intypen, gevolgd door Tab in een C# editor in Visual Studio 2019

  • prop property maken
  • svm Main-methode maken

Code documenteren

/// intypen voor een klasse, methode, property, …

/// <summary>
/// ...
/// </summary>

Code documenteren

Project properties

→ Build

→ XML documentation file aanvinken.

Objectoriëntatie

OOAD = Object Oriented Analysis and Design

UML = Unified Modeling Language

OOP = Object Oriented Programming

SOLID

  • SRP (Single reponsibility)
  • OCP (Open/Closed)
  • LSP (Liskov Substitution)
  • ISP (Interface Segregation)
  • DIP (Dependency Inversion)

Meer OO principes

Design Patterns

GoF Patterns zijn klassiekers in OOAD

Maar moderne OO programmeertalen

  • zijn niet meer puur OO
  • zijn ook deels functionele talen

Te onthouden

Model

  • bestaat los van applicaties
  • bestaat los van persistentie (DB)
  • wordt best afzonderlijk geïmplementeerd
  • moet kunnen veranderen

MVVM

Model en View scheiden in WPF, door gebruik te maken van ViewModels, klassen die precies daarvoor dienen.

MVVM Light

→ Best uitgelegd door Laurent Bugnion.

Architectuur van webapplicaties

Leesopdracht

E-book

Lees dit boek door. Blijf niet hangen bij wat je niet begrijpt, maar hou bij waar je meer uitleg over nodig hebt.

Opdracht architectuur en design patterns

Opdracht:

  • Stel 7 goede vragen over architectuur, design principles.
  • Een goede vraag wordt door minstens 3 anderen ook als een goede vraag aangeduid.
  • Probeer als eerste een goed antwoord te formuleren op 4 vragen van anderen.

Na de deadline (nog te bepalen): discussie en beantwoorden resterende vragen.

Testen

Oefening kruisen lijnstukken

Gegeven:

2 lijnstukken (geen rechten, maar lijstukken), je krijgt coördinaten van begin- en eindpunten. Die kunnen al dan niet tot het lijnstuk behoren.

Vraag:

Implementeer een methode zodat

lijstuk1.Kruist(lijstuk2);

een bool weergeeft die aangeeft of de lijnstukken elkaar kruisen.

Unit testing

  • Visual Studio
    • Speciale projecttypes, o.a. xUnit voor .NET Standard
    • Test Explorer: runnen en debuggen van tests
      →ingang voor moeilijk te bereiken code

Whitebox test

Eigen code testen

Moeilijk te bereiken code debuggen, ook voor corner cases of speciale gevallen

In plaats van telkens een main-methode te schrijven, kan je een unit test schrijven.

Regressietests

Regressie = herintroductie van een bug die al eens was opgelost

Voorzienbare fouten in toekomstige versies vermijden

Dependencies: controleren of aannames blijven kloppen, ook bij update van dependencies

Regressietests: hoe maken?

  • Maak een unit test die alleen maar kan slagen als de bug opgelost is.
  • Volgende versies: regressietest moet blijven slagen
  • Zo komen oude bugs minder waarschijnlijk terug

Welke code wordt er getest

Code coverage tools

Gratis: axoCover

Unit test framework

Test class

  • (optioneel) setup
  • (optioneel) tear down
  • Test method 1
  • Test method 2

Test methods kunnen parameters hebben

1 unit test per mogelijke combinatie parameters

Unit test framework

Uitvoering van tests: in nieuwe thread

  • nieuwe instantie van testklasse
  • test setup (indien geïmplementeerd)
    • voor elke unit test
  • unit test method
  • test tear down (indien geïmplementeerd)
    • na elke unit test

Normaal geen 2 tests tegelijk

xUnit

Test zonder parameters:

[Fact]

Test met parameters:

[Theory]

Oefening

  • class library voor oefening kruisen lijnstukken
  • xUnit project
  • maak een unit test voor alle mogelijke speciale gevallen
  • implementeer NA schrijven van de testen.

Versiebeheer met Git

Wat is Git?

Intro en documentatie

Private repository voor Visual Studio maken op GitHub

Nieuwe GitHub repo openen in Visual Studio

Leren werken met Git (single user)

Naast Git bestaan er ook nog andere versiebeheersystemen, zoals TFS, Subversion, Mercurial, … Git is tegenwoordig veruit het meest gebruikte.

PowerShell

Openen: via vscode, Visual Studio (NuGet package manager console) of via Windows start menu

Navigeren: ls, pwd, cd, …

Nieuw .NET-object aanmaken: New-Object

.NET-klasse gebruiken: tussen [System.String] of soms verkort [string]

Pipes: | → resultaat gebruiken in volgend commando.

Scripts schrijven kan ook, maar valt buiten de scope van deze module.

Werk lokaal met de command-line tools

Na installatie van git scm: oefen lokaal met de commando’s.

  • help
  • init
  • clone (lokaal)
  • push
  • fetch en pull
  • reset en reset –hard

Werk lokaal met de Git-ondersteuning in Visual Studio

  • Maak een solution met de naam Oefeningen
    • Als eerste project maak je een .NET Standard 2.0 class library
  • Voeg de solution toe aan een nieuwe lokale git-repository mbv Visual Studio of command line (git init)
  • Voeg alle wijzigingen toe en maak je eerste commit

Aanmaken repo op Github

Github.com is zeker niet de enige manier om je git repository online te brengen. Alternatieven zijn Azure DevOps, BitBucket, GitLab, …

→ Maak een repo op je eigen account(YT). Maak die ofwel public of voeg eventueel anderen toe als contributor.

Test Git

Als het werken met Git minder vlot verloopt kan er een test volgen om u te motiveren daar tijd in te steken.

EF Core

Entity Framework Core

  • is een ORM
  • gebaseerd op .NET Standard

Code first, deel 1

Code first, deel 2

Maken en deployen SQL Server database met SSDT

REST APIs

API maken en consumen met PowerShell

Consumen van api met System.Net in C

Consume REST Api in .NET Core en .NET Framework met RestSharp

Consume rest api met javascript

Consume REST api met html form

MVC

ASP.NET Core MVC 1/8

ASP.NET Core MVC 2/8

ASP.NET Core MVC 3/8

ASP.NET Core MVC 4/8

ASP.NET Core MVC 5/8

ASP.NET Core MVC 6/8

ASP.NET Core MVC 7/8

ASP.NET Core MVC 8/8

Over deze slides

Philip van Oosten

vanoosten.be