Category Archives: Development Tools

Working Effectively with Legacy Code – záznam, dema a slides [WUG Praha 04/2017]

Slides z mé přednášky pro WUG Praha z 26.4.2017:

Záznam z přednášky je publikován na našem HAVIT YouTube Channel.

Dotčená témata

  • „definice“ Legacy Code
  • Refactoring Mindset
  • Roslyn Code Analyzers – C#, StyleCop, SonarLint, Global Suppressions
  • Testability – extract dependencies do virtuálních metod + override v testu
  • Mocking – Moq
  • Advanced Testing – Fixture
  • extrakce dependencies, Dependency Injection

TFS (XAML) Builds – Jak vytvořit lokální workspace

TFS (XAML) Build vytvoří workspace na build serveru, do něj stáhne zdrojové kódy a ty kompiluje. Workspace vytváří aktivita CreateWorkspace, která vytvoří serverový workspace a není způsob, jak této aktivitě říct, aby vytvořila workspace lokální. Aktivita CreateWorkspace navíc vrací instanci reprezentující založený workspace.

Když tedy nelze při říct, že založený workspace má být lokální, lze použít drobný workaround – založit workspace jako serverový a dodatečně jej přepnout na lokální. To lze provést zavoláním metody Update na instanci vrácené z CreateWorkspace. V rámci TFS (XAML) Buildu to můžeme udělat reflexí, tedy aktivitou InvokeMethod s těmito parametry:

  • Target Object: Workspace (resp. taková proměná, ve které máme vrácenou instanci z activity CreateWorkspace)
  • Method Name: Update
  • Parameters: In / Microsoft.TeamFoundation.VersionControl.Client.UpdateWorkspaceParameters / New UpdateWorkspaceParameters With { .Location = Microsoft.TeamFoundation.VersionControl.Common.WorkspaceLocation.Local }

O rozdílech mezi lokálním a serverovým workspacem si můžete přečíst tady nebo tady. Naše touha pro přechod ze serverového na lokální workspace byla vedena přiblížením prostředí buildu vývojářskému prostředí, zejména nenastavení read-only atributů na stažených souborech.

 

MSB3270 Processor Architecture Mismatch Warning – jak ho skrýt z výpisu chyb

Pokud máte stejně jako já rádi čisté okno Error List ve Visual Studiu, pak vás může otravovat warrning typu

There was a mismatch between the processor architecture of the project being built „MSIL“ and the processor architecture of the reference „XYZ, Version=XXX, Culture=neutral, processorArchitecture=x86“, „XXX“. This mismatch may cause runtime failures. Please consider changing the targeted processor architecture of your project through the Configuration Manager so as to align the processor architectures between your project and references, or take a dependency on references with a processor architecture that matches the targeted processor architecture of your project.

Nechci teď rozebírat, jak vyřešit příčinu hlášky, ale mám návod, jak se vypořádat se situací, kdy se příčiny zbavit nechcete/nemůžete, ale potřebujete hlášku potlačit (suppress).

Do .csproj souboru příslušného projektu stačí do úvodní sekce PropertyGroup přidat:

<PropertyGroup>
  <ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>None</ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
</PropertyGroup>

Jenom pozor, že tím můžete zakrýt i další varování, která se objeví později a mohou vás zajímat.

VS2017 #NoResharper Challenge: Navigace Ctrl+T, [něco]+T

Klíčovou funkcí Resharperu pro mě byla rychlá navigace k souborům – vyhledávání podle názvu souboru, třídy, memberu, atp. Moje nejčastější klávesová zkratka byla Shift+Alt+T, hledání souboru.

Visual Studio mělo už v předchozích verzích funkci Navigate to… pod klávesovou zkratkou Ctrl+,. Alternativou bylo i Ctrl+ů – hledání v Solution Exploreru. Ani jedna z těchto variant však kvalitativně ani zdaleka nesahala Resharperu po paty.

Visual Studio 2017 udělalo v tomto značný krok kupředu. Původní Navigate to… se proměnilo v nové Go to… (kromě Ctrl+, přibyla i klávesová zkratka Ctrl+T) a umožňuje už samostatné hledání v souborech/memberech/…

image

Kdo je zvyklý z Resharperu, syntaxe je zde trochu jiná a je to o zvyk. Kromě klávesových zkratek přímo na jednotlivé typy vyhledávání lze použít i Go To All… (Ctrl+T) a přepínač v podobě prvního znaku vyhledávací fráze:

image

Největší slabinou zatím zůstává, že výsledky vyhledávání nejsou seřazeny podle relevance, ale podle abecedy. Občas je to tedy porod:

image

…taková blbost, ale otráví to, když ImportedBook.cs najdete až na třetí stránce a neexistuje syntaxe, jak to dopravit nahoru, dokud existují odpovídající soubory (nebo jsem alespoň zatím nenašel, jak to ochočit). Až na tyto výjimky se s tím však zdá se žít dá, byť plnohodnotná náhrada Resharperu to není.

Kdo by se s tím nesžil, toho odkážu na alternativní doplňky, které jsem zkoušel při své VS2015 #NoResharper challenge:

VS2017 #NoResharper Challenge: Refactorings

Další podstatnou věcí, kterou R# přináší, je mnoho drobných refactoringů. Osobně jsem v tomto příznivcem Roslynu (Compiler Services), takže jsem už při předchozích #NoResharper pokusech nějaké poznatky nabral:

  • Introduce And Initialize Local Field – Úplně na začátku, dokud nic nebylo, napsal jsem jednu vlastní extension.
  • Refactoring Essentials – pro VS2015 jsem používal Refactoring Essentials. Bohužel poslední release je půl roku starý a pro VS2017 zatím verze není.
  • Roslynator Refactorings 2017 – Letmým hledáním pro VS2017 nacházím tento doplněk od Josefa Pihrta, který vypadá celkem obstojně, co se nabízeného rozsahu refactoringů týče. Navíc jde o českou produkci, tak proč to nezkusit a nepodpořit.

Jestli mi budou nějaké refactoringy chybět, pokusím se najít další/jiné náhrady, popř. je zařadím na seznam „Co jsem musel obětovat“ a uvidíme, co na něm nakonec zbude.

VS2017 #NoResharper Challenge: Duplicate Line (Ctrl+D)

Jako téměř s každou novou verzí Visual Studia, nechávám se pravidelně unést představou, že by to šlo bez Resharperu, střelím se do nohy, vypnu Resharper a zkouším to bez něj (s pomocí samotného VS a minimalistickými extensions).

Dnes jsem se tedy opět vydal na tento pokus a budu vás v jednotlivých postech seznamovat s tipy, jak funkce R# nahradit. Jestli to nakonec celé uzavřu zapnutím R#, nebo vydržím bez něj, to jsem sám zvědav (naposledy jsem opustil R# s upgradem z VS2003 na VS2005 a vydržel jsem to bez R# až do VS2012, kdy mi začaly některé funkce výrazně chybět.)

První drobnost, kterou mi R# usnadňoval život, byla klávesová zkratka Ctrl+D na duplikaci řádku. Dá se bez toho určitě žít. Kdo by to potřeboval, je na to minimalistický doplněk:

https://marketplace.visualstudio.com/items?itemName=ctlajoie.DuplicateSelection