Dit probleem houdt mij al een tijdje bezig..
Ik werk vaak aan projecten waarbij code gedeeld wordt tussen Windows Forms applicaties en webapplicaties. In de praktijk komt het vaak voor dat dit veel minder netjes gebeurt dan je zou willen (lees: er wordt vaak code gekopieerd en aangepast in plaats van hergebruikt, omdat het toch niet helemaal lekker werkt).
Omdat we hierdoor 1 grote rommel krijgen in onze backend code probeer ik hier oplossingen voor te vinden. In theorie lukt mij dat prima, in de praktijk wat minder, omdat elke abstractielaag leidt tot extra werk.. met als consequentie dat collega's er niet altijd aan willen beginnen (begrijpelijk).
Iets dat ik bijvoorbeeld handig vind, is het gebruik van een stateless service layer. Omdat de code stateless is, kun je hem bijna overal voor gebruiken.
Maar goed, als ik dan een Windows Forms scherm ga bouwen dan krijg je al snel:
- De service layer (met ORM models, repositories, transactiemanagement, etc)
- Een viewmodel (die de echte programmacode en state bevat zeg maar)
- De Windows Forms controls / form (die door middel van databinding werken met het viewmodel)
In de praktijk kun je echter ook gewoon de Windows Forms controls aan een DataSet hangen en gewoon de wat complexere code in aparte functies / modules plaatsen en klaar is kees.
De herbruikbaarheid is dan zoek, maar ja.. het scherm bouw je bijna 3 keer zo snel.
En moet je dan een webversie ervan maken, dan gebeurt precies hetzelfde. Code die gevoelig is voor verandering, vanwege een grote complexiteit (een kortingsroutine bijvoorbeeld), wordt dan wel in een gedeelde library geplaatst. Maar de rest wordt vaak opnieuw gebouwd of gekopieerd en aangepast.
Persoonlijk zit ik nu in dubio qua wat wijsheid is.
"Good architecture" vs "Getting shit done" zeg maar. En daar een goede balans in te vinden.
Kortom, hoe ver ga je met het scheiden van functionaliteit? Hoe belangrijk is de reusability? Enzovoorts.
Ik heb jarenlang erg pragmatisch gewerkt en mij eigenlijk niet zo druk gemaakt om een goede architectuur. De laatste jaren ben ik er wel erg mee bezig (design patterns, code reusability, dependency injection, SOLID principes etc), maar vaak wel erg in dubio wat praktisch haalbaar is en wat niet.
Het kan bijna niet dat ik de enige ben die hier tegen aanloopt, dus ik ben benieuwd hoe ver jullie hier in gaan.
Bijvoorbeeld:
Gebruiken jullie altijd een ORM bij Windows Forms? Of toch ook wel gewoon DataSet's omdat het simpelweg makkelijker werkt? Data binding in Windows Forms is immers beperkter dan in WPF. Ik kan het allemaal prima fixen met viewmodel classes die INotifyPropertyChanged implementeren (maar ja, extra werk dus).
Ik lees vaak dat het "not done" is om objecten uit een datalaag te exposen aan de user interface. Gebruiken jullie altijd een mapper tussen ORM classes en viewmodel classes? Of komt het ook weleens voor dat je proxy classes van een ORM aan een user interface hangt?
Enzovoorts.
Ik kan ook niet zo heel veel qua best practices over Windows Forms vinden
Tegenwoordig is iedereen van de HTML5 SPA's, of MVC web apps, misschien nog WPF. Maar ja, voorlopig werk ik de rest van het jaar aan een Windows Forms applicatie
En dan wil ik daar toch het beste van maken. Bij web development loop ik minder tegen deze problemen aan, omdat het tegenwoordig sowieso nodig is om een web api te bouwen om nieuwe frameworks als AngularJS te ondersteunen (die min of meer zelf een viewmodel managen, in Angular de scope).
Ik werk vaak aan projecten waarbij code gedeeld wordt tussen Windows Forms applicaties en webapplicaties. In de praktijk komt het vaak voor dat dit veel minder netjes gebeurt dan je zou willen (lees: er wordt vaak code gekopieerd en aangepast in plaats van hergebruikt, omdat het toch niet helemaal lekker werkt).
Omdat we hierdoor 1 grote rommel krijgen in onze backend code probeer ik hier oplossingen voor te vinden. In theorie lukt mij dat prima, in de praktijk wat minder, omdat elke abstractielaag leidt tot extra werk.. met als consequentie dat collega's er niet altijd aan willen beginnen (begrijpelijk).
Iets dat ik bijvoorbeeld handig vind, is het gebruik van een stateless service layer. Omdat de code stateless is, kun je hem bijna overal voor gebruiken.
Maar goed, als ik dan een Windows Forms scherm ga bouwen dan krijg je al snel:
- De service layer (met ORM models, repositories, transactiemanagement, etc)
- Een viewmodel (die de echte programmacode en state bevat zeg maar)
- De Windows Forms controls / form (die door middel van databinding werken met het viewmodel)
In de praktijk kun je echter ook gewoon de Windows Forms controls aan een DataSet hangen en gewoon de wat complexere code in aparte functies / modules plaatsen en klaar is kees.
De herbruikbaarheid is dan zoek, maar ja.. het scherm bouw je bijna 3 keer zo snel.
En moet je dan een webversie ervan maken, dan gebeurt precies hetzelfde. Code die gevoelig is voor verandering, vanwege een grote complexiteit (een kortingsroutine bijvoorbeeld), wordt dan wel in een gedeelde library geplaatst. Maar de rest wordt vaak opnieuw gebouwd of gekopieerd en aangepast.
Persoonlijk zit ik nu in dubio qua wat wijsheid is.
"Good architecture" vs "Getting shit done" zeg maar. En daar een goede balans in te vinden.
Kortom, hoe ver ga je met het scheiden van functionaliteit? Hoe belangrijk is de reusability? Enzovoorts.
Ik heb jarenlang erg pragmatisch gewerkt en mij eigenlijk niet zo druk gemaakt om een goede architectuur. De laatste jaren ben ik er wel erg mee bezig (design patterns, code reusability, dependency injection, SOLID principes etc), maar vaak wel erg in dubio wat praktisch haalbaar is en wat niet.
Het kan bijna niet dat ik de enige ben die hier tegen aanloopt, dus ik ben benieuwd hoe ver jullie hier in gaan.
Bijvoorbeeld:
Gebruiken jullie altijd een ORM bij Windows Forms? Of toch ook wel gewoon DataSet's omdat het simpelweg makkelijker werkt? Data binding in Windows Forms is immers beperkter dan in WPF. Ik kan het allemaal prima fixen met viewmodel classes die INotifyPropertyChanged implementeren (maar ja, extra werk dus).
Ik lees vaak dat het "not done" is om objecten uit een datalaag te exposen aan de user interface. Gebruiken jullie altijd een mapper tussen ORM classes en viewmodel classes? Of komt het ook weleens voor dat je proxy classes van een ORM aan een user interface hangt?
Enzovoorts.
Ik kan ook niet zo heel veel qua best practices over Windows Forms vinden

Ask yourself if you are happy and then you cease to be.