Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Nextlevel Clean Code Development
Search
Stefan Lieser
June 28, 2017
Programming
0
950
Nextlevel Clean Code Development
Session auf der Developer Week DWX 2017.
Stefan Lieser
June 28, 2017
Tweet
Share
More Decks by Stefan Lieser
See All by Stefan Lieser
Lernen durch Üben
slieser
0
620
Other Decks in Programming
See All in Programming
PHPに関数型の魂を宿す〜PHP 8.5 で実現する堅牢なコードとは〜 #phpcon_hiroshima / phpcon-hiroshima-2025
shogogg
1
160
GraphQL×Railsアプリのデータベース負荷分散 - 月間3,000万人利用サービスを無停止で
koxya
1
1.3k
iOSエンジニア向けの英語学習アプリを作る!
yukawashouhei
0
190
Software Architecture
hschwentner
6
2.3k
CSC509 Lecture 06
javiergs
PRO
0
260
Catch Up: Go Style Guide Update
andpad
0
220
大規模アプリのDIフレームワーク刷新戦略 ~過去最大規模の並行開発を止めずにアプリ全体に導入するまで~
mot_techtalk
1
440
Leading Effective Engineering Teams in the AI Era
addyosmani
1
300
Devvox Belgium - Agentic AI Patterns
kdubois
1
120
Railsだからできる 例外業務に禍根を残さない 設定設計パターン
ei_ei_eiichi
0
470
Cursorハンズオン実践!
eltociear
2
1k
「ちょっと古いから」って避けてた技術書、今だからこそ読もう
mottyzzz
10
6.6k
Featured
See All Featured
How to train your dragon (web standard)
notwaldorf
96
6.3k
[RailsConf 2023] Rails as a piece of cake
palkan
57
5.9k
Designing Experiences People Love
moore
142
24k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
30
2.7k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.5k
Build The Right Thing And Hit Your Dates
maggiecrowley
37
2.9k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
How GitHub (no longer) Works
holman
315
140k
Building Adaptive Systems
keathley
43
2.8k
A designer walks into a library…
pauljervisheath
209
24k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Art, The Web, and Tiny UX
lynnandtonic
303
21k
Transcript
Nextlevel Clean Code Development Stefan Lieser @stefanlieser h#p://refactoring-legacy-code.net
2008/2009 Clean Code Developer Initiative http://clean-code-developer.de
Clean Code Developer Initiative 42 Prinzipien und Praktiken - DRY:
Don‘t Repeat Yourself - SLA: Single Level Abstraction - SRP: Single Responsibility Principle - Test-first - Continuous Integration
Clean Code Developer Initiative 4 Werte - Korrektheit - Wandelbarkeit
(Evolvierbarkeit) - Produktionseffizienz - Kontinuierliche Verbesserung
Clean Code Developer Initiative 5 Grade erleichtern das Lernen -
Rot - Orange - Gelb - Grün - Blau Je ca. 8 Prinzipien & Praktiken
None
None
2009 Erste CCD School Trainings http://ccd-school.de
CCD School Trainings 5 Tage Training 4 Wochen Pause mit
Hausaufgabe 5 Tage Training
CCD School Trainings 5 Tage Training 4 Wochen Pause mit
Hausaufgabe 5 Tage Training 6-10 Einzeltage 4 Wochen Pausen mit Hausaufgaben
2010 dotnetpro Dojo Seitdem in jedem Heft: - eine neue
Übungsaufgabe - meine Lösung zum Vormonat Aktuell: 89 Aufgaben mit Lösung
CCD School Trainings Erkenntnis: In den Code Reviews zeigen sich
Verletzungen der Prinzipien Unser Ziel: Ein methodisches Vorgehen entwickeln
2010 Injection Based Components (IBC) Entwurf mit Abhängigkeits- diagrammen System-Umwelt-Diagramm
(Softwarezelle) Featurestreams
None
None
2011 Flow Design und Event Based Components (EBC) Entwurf mit
Datenflüssen Implementation mit Events und Methoden
None
None
None
var zerlegenInZeichenfolgen = new ZerlegenInZeichenfolgen(); var zeichenfolgenTrennen = new ZeichenfolgenTrennen();
var zusammenfassenZuZeilen = new ZusammenfassenZuZeilen(); var zusammenfassenZuText = new ZusammenfassenZuText(); zerlegenInZeichenfolgen.Out_Result += zeichenfolgenTrennen.In_Process; zeichenfolgenTrennen.Out_Result += zusammenfassenZuZeilen.In_Process; zusammenfassenZuZeilen.Out_Result += zusammenfassenZuText.In_Process; zusammenfassenZuText.Out_Result += text => Out_Result(text); Event Methode
2011 EBC Tooling Flow in XML notieren, Codegenerator, Visualisierung
<?xml version="1.0" encoding="uA-8"?> <board name="NeueDatenBoard"> <using namespace="verbräuche.contracts.infrastructure"/> <using namespace="verbräuche.contracts.model"/> <using
namespace="verbräuche.contracts.viewmodels"/> <external name="IMap_Verbrauchswerte_to_Viewmodel"/> <wire from="JahresübersichtVM.Neue_Daten" type="“ to="Folgemonat_ermi#eln"/> <wire from="Folgemonat_ermi#eln" type="string“ to="NeueDatenVM.Monat_setzen"/> <wire from="NeueDatenVM" type="DatensatzVM" to="Map_to_Datensatz"/> <wire from="Map_to_Datensatz" type="Datensatz" to="Datensatz_anhängen"/> <wire from="Datensatz_anhängen" type="Datensatz*" to="Map_Verbrauchswerte_to_Viewmodel"/> <dependency from="Folgemonat_ermi#eln" to="Verbrauchswerte"/> <dependency from="Datensatz_anhängen" to="Verbrauchswerte"/> </board>
None
2012 Flow Runtime NPantaRhei Flow als String notieren, Verdrahtung per
Konvention Parallelisierung per Konfiguration möglich Debugging schwer nachvollziehbar
/ .start, mail_abholen mail_abholen, erinnerungsauUrag_erstellen erinnerungsauUrag_erstellen, erinnerungsauUrag_speichern erinnerungsauUrag_speichern, mail_verschieben mail_verschieben,
.exit
None
2013 Methoden statt Klassen Drastische Vereinfachung!
None
public IEnumerable<string> Start() { var filename = EnvironmentProvider.Hole_Dateiname(); var text
= TextdateiProvider.Lese_Text(filename); textspeicher.Setze_Text(text); var size = seitengröße.Hole_Fenstergröße(); var umbrochener_text = Textanalyse.Umbreche_Text(text, size.Width); var seite = blättern.Extrahiere_erste_Seite( umbrochener_text, size.Height); return seite; }
2013 IOSP / PoMO / IODA Die wichtigsten Prinzipien.
Integration Operation Segregation Principle (IOSP)
Principle of Mutual Oblivion (PoMO) Prinzip der gegenseitigen Nichtbeachtung
Integration Operation Data Integration Operation Data API (IODA) API
Nextlevel - Softwareuniversum - System-Umwelt-Diagramm - Domänenzerlegung (Anforderungen) - Flow
Design für den Entwurf - IOSP/PoMO/IODA
None
None
Rolle Ressource System Portal Provider Domänenlogik
Domänenzerlegung: Dialoge und Interaktionen
Entwurf der obersten Ebene
Verfeinerung der Entwürfe
public bool[,] Initialize() { var world = gameOfLife.CreateEmptyWorld(); state.Put(world); return
world; }
None
public void CellChanged(int x, int y) { var world =
state.Get(); var newWorld = gameOfLife.ToggleCellAt(world, x, y); state.Put(newWorld); }
None
public void Start(Action<bool[,]> onUpdate) { timerProvider.Start(() => { var world
= state.Get(); var newWorld = gameOfLife.Evolution(world); state.Put(newWorld); synchronization.Sync(() => { onUpdate(newWorld); }); }); }
None
public void Stop() { timerProvider.Stop(); }
Fazit Clean Code entsteht nur durch methodisches Vorgehen
Fazit Clean Code entsteht nur durch methodisches Vorgehen Anforderungen müssen
zerlegt werden (Slicing, Domänenzerlegung)
Fazit Clean Code entsteht nur durch methodisches Vorgehen Anforderungen müssen
zerlegt werden (Slicing, Domänenzerlegung) Entwurf der Lösung vor der Umsetzung ist notwendig (Flow Design)
h#p://stefanlieser.teachable.com
h#p://refactoring-legacy-code.net h#p://linkedin.com/in/stefanlieser h#ps://twi#er.com/StefanLieser h#p://xing.com/profile/stefan_lieser