Doorgaan naar hoofdcontent

Articles Flash: Fail-Fast / Robustness, Rich/Anemic domain models

Some articles regarding design philosophies:
Domain models: rich or anemic? World is at fire, both have advantages, disadvantages.
Personally, I'm more of a data-driven anemic model.
Where business logic is governed by the business layer, and persistance by the persistance layer, the question is where the domain model resides. I like it more in the persistance layer. This does allow one to hopelessly mutilate the domain model in not allowed ways, but it also SOLID, since it only has one responsibility.
http://techblog.bozho.net/on-domain-driven-design-anemic-domain-models-code-generation-dependency-injection-and-more/
https://blog.inf.ed.ac.uk/sapm/2014/02/04/the-anaemic-domain-model-is-no-anti-pattern-its-a-solid-design/
http://stackoverflow.com/questions/23314330/rich-vs-anemic-domain-model
And of course wikipedia:
https://en.wikipedia.org/wiki/Anemic_domain_model

For me, this is also because I'm not much of an OO-fan. Luckily, I'm not the only one:
http://www.yegor256.com/2016/08/15/what-is-wrong-object-oriented-programming.html

now onto another biggie: fail-fast vs robustness.
Ideally, I'd like to to all my validation in the validation tier, i.e. in (or before) the front of the application. But it's reeeeeeeeeeeeeaaaally easy to just ad that if(something != null) in front of that callMyFunctionWhichUses(something)... Which is a bad thing, because now I've added complexity to my wonderful code, and a separate path. And from there, I might violate business concerns since I accidentily do not do critical stuff. And then I have to debug *why* I didn't do that critical stuff. And it's really hard. So ideally, I don't want that code... Unless it's going to a different system which should support it. If I have a call to a different system with optional fields, most of the time it's easier to just assume that my data is correct, and straight-through fill it to the external system. It'll have its own validation, and it'll tell me when I'm wrong, right?
Hmmm... maybe there's a fallacy there ;)
In any case, some articles:
http://www.yegor256.com/2015/08/25/fail-fast.html
We really should add wikipedia's here: https://en.wikipedia.org/wiki/Robustness_principle
And be aware that it has it's cost. It means deviating from specs for easy, forgiving applications. This, howver, in turn restrict us in further refactoring, since all of a sudden working code might break even if it still is up to spec, since bugs in neighboring code might accidentally use those undocumented features.

Reacties

Populaire posts van deze blog

Spring's conditional annotation with properties

Spring has a nice @Conditional annotation, to have the option to have beans be available in the context depending a specific condition (Of course, this can also be realized by using @Configuration objects, but that's a different post). Ideally, we'd have the option to have a condition evaluate to true or false depending on a property. Sadly, Spring does not support that out of the box. Googling and looking around gives a partial solution, but the complete one here, so we won't forget: /** * Components annotated with ConditionalOnProperty will be registered in the spring context depending on the value of a * property defined in the propertiesBeanName properties Bean. */ @Target({ ElementType.TYPE, ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) @Conditional(OnPropertyCondition.class) public @interface ConditionalOnProperty { /** * The name of the property. If not found, it will evaluate to false. */ String value(); /** * if the p...

Windows batch scripting god ( java runtime switch)

 I am a batch scripting god. After a lot of pain, I managed to create a script which allows me to switch jvm's easily. For posterity, and my own flex skills, the script: @echo off rem set your local path to all the JVM's here. set jvmdir=c:\code\apps\jvms if NOT EXIST %jvmdir% goto invaliddir rem a little bit of manipulation rem first we remove everything before the jvms dir call set __temp=%%path:*%jvmdir%\=%% rem then we determine everything that follows after the next slash set __lastbit=%__temp:*\=% rem then we remove that lastbit, leaving only the entire directory and a \ at the end. call set __currentpath=%%__temp:%__lastbit%=%% rem then we remove the \ at the end set __currentjvm=%__currentpath:\=% if "%~1"=="" goto missingarg if NOT EXIST %jvmdir%\%1 goto unknowndir set __currentpath=%jvmdir%\%__currentjvm% set __replacement=%jvmdir%\%1 call SET path=%%path:%__currentpath%=%__replacement%%% CALL SET JAVA_HOME=%%JAVA_HOME:%__currentpath%=%__replacemen...

Using spring's @transactional to only roll back when you really want to

In spring you can use the @Transactional annotation to marcate public methods as transactions. Any exception thrown in such an exception causes a rollback... Any exception? No, spring only does so on runtime exceptions. Checked exceptions are allowed and do not result in a rollback. And even then, you can allow some transactions to rollback, or not, with the proper properties for the transactions. For examle, @Transactional(rollbackFor="MyCheckedException.class") will rollback for a specific checked exception, and similarly, you can use @Transactional(noRollbackFor="MyUncheckedException.class") for unchecked exceptions. Of course, you might want to make it a little simpler on yourself. This article on stackoverflow shows us a different way: we can use our own transaction handler by overriding spring's. Let's have a sample interface which defines whether an exception should perform a rollback: interface ConfigurableRollback shouldRollbackOnE...