SOLID principals in D
Joakim
dlang at joakim.fea.st
Sun Jun 17 04:47:47 UTC 2018
On Sunday, 17 June 2018 at 01:38:17 UTC, evilrat wrote:
> On Saturday, 16 June 2018 at 19:20:30 UTC, FromAnotherPlanet
> wrote:
>> Hi, I come from a C# background and have been looking at D.
>> How well does D implement solid principals? I've grown to
>> really enjoy the SOLID style.
>>
>> For those unfamiliar, SOLID is an acronym for:
>>
>> - Single purpose: Meaning every unit of code (whether it's a
>> function or class) should only
>> have one reason to change.
>>
>> - Open/Close principal: Things should be open to extension
>> but closed to modification. The example I like to use is some
>> sort of IConverter object. Things can implement IConverter,
>> but if you need a new way to 'convert' things, you don't
>> extend an existing object, but instead create a new class that
>> implements IConverter.
>>
>> - Liskov substitution principle: Essentially says if I have a
>> method/function that takes a base class, then the behavior of
>> that method shouldn't change when passing in derived objects.
>> I think the term people like to use is whether or not you use
>> a base/derived class it shouldn't effect the 'correctness' of
>> the program.
>>
>> - Interface segregation principal: Essentially breaking the
>> program up into smaller interfaces. Sometimes only consistent
>> of one or two methods/properties (can feed into 'S' of SOLID
>> quite nicely).
>>
>> - Dependency inversion principle: Things should depend on
>> abstractions not concretions. Strongly enables dependency
>> injection.
>>
>> D seems to have all of the features *required* to make this
>> happen, but I guess the real question is the last two, and
>> more specifically the last one.
>
> I am still not a D pro, so some thoughts maybe a bit off...
>
> (intro part)
> The "true D" guru's would tell you "in D your typical code
> would be mostly ranges(or templates) instead of classes", there
> is a good portion truth, but IMHO I find it overly attached.
> D uses duck typing for ranges, which means for example very
> basic (input) range have this protocol of 3 primitives -
> popFront(), front, empty
> Ranges heavily used in conjunction with templates, and
> templates is static thing, but with clever use of duck typing
> and that range protocol usually you don't care about specific
> type at all when dealing with ranges. Of course there is
> polymorphic interface(as in C#) for ranges too.
>
>
> Now how it applies to S and O? Ranges is basically an essence
> of S principle, they do exactly single thing, and most
> functions taking ranges as well.
> Just look at this "Sort lines" or some other examples on main
> page:
> -----------------
> stdin
> .byLineCopy
> .array
> .sort!((a, b) => a > b) // descending order
> .each!writeln;
> --------------
Thought I'd add a link to Walter's good article laying out the
case for such component programming with ranges:
http://www.drdobbs.com/architecture-and-design/component-programming-in-d/240008321
More information about the Digitalmars-d
mailing list