Content deleted Content added
Tag: |
|||
(20 intermediate revisions by 15 users not shown) | |||
Line 1:
{{WikiProject banner shell|class=Start|
{{WikiProject Computer science|importance=Low}}
}}
== Where does criticism come from? ==
There is no citation or reference of any kind with the criticisms. They may be valid but seem to be the opinion of the author. --[[Special:Contributions/4.14.21.30|4.14.21.30]] ([[User talk:4.14.21.30|talk]]) 14:18, 29 March 2018 (UTC)
...I have to admit I may have missed the point, but is this "pattern" just a way to do Boolean logic with a few pages of new classes and code? Cause, yeah--I've been stringing together Boolean values with logical operators for a long time. [[Special:Contributions/158.111.236.74|158.111.236.74]] ([[User talk:158.111.236.74|talk]]) 16:31, 6 August 2019 (UTC)
== Class explosion + bad explanation ==
First, this article has a pretty bad explanation and needs to be cleaned up. I'll try, but I'm not a design pattern expert by any means, even though I am a CS student and have taken a software engineering course. It just seems like this design pattern is a big absurd in implementing boolean logic through classes. Such operators exist in every language, why would classes need to exist to perform their function? And then on top if this, you need even more classes to implement every little detail of specification needed. If anyone has some good criticisms, maybe this could have a criticism section too... (a web search didn't turn up anything, but I haven't checked any journals) [[User:HebrewHammerTime|HebrewHammerTime]] 09:19, 26 September 2007 (UTC)
:Often times patterns seem quite useless unless you run into the problem that the pattern solves. The specification pattern allows for functional-style (no side effect) boolean business logic recombination that is easily testable and reused in the business tier *or* in the presentation tier (check the reference to the Domain Driven Design book). In your reference to 'such operators exist in every language' I'd like to point out that you don't have set-up or tear-down ability for Boolean operators in many languages (overloading the 'and' and 'or' symbols). Given that, you would have to put set up/tear down code in a procedure style script with the rest of your Boolean logic (e.g. you would put perhaps database retrieval code to populate the classes in question, along with the rest of whatever other objects you need for attribute population, along with traversal/sorting of any internal representations if the class has internal array properties). In the example there is a 'collection' specification, which would in theory need to have an internal collection of whatever the business rules consider to be 'sent notices'. This could be notices that have been sent certified mail only, and not notices that are in the database and have been sent, but not as certified. The set up for such a business rule would need to be regurgitated every time you wanted to chain that rule with another one. In short, if you have Boolean rules that get recombined often and are reused in multiple places (aka specifications), you have a tool in the specification pattern. In reference to your 'class explosion' comment, you'll find that class explosion happens when people over use 'is-a' aka inheritance relationships. The specification pattern stands in a 'has-a' composite/delegate relationship with real-world objects, so the explosion doesn't happen in practice. In popular ORM frameworks such as Hibernate you have a '___domain' of classes that represent real-world things. Then you have the logic that controls that ___domain (i.e. employees in certain labor categories must get over-time by law, when working over 40 hours). That rule that I just said should have only one instance where the code resides (see http://en.wikipedia.org/wiki/Separation_of_concerns). If you use that rule in many different classes, you'll quickly find out that you have code duplication. You may then make some kind of external class/function that gets called whenever some kind of 'saving' of a payroll happens. You may then run into places where you don't want to save based on that rule, you just want to use that rule as the basis of another rule (e.g. a comp-time rule that only gets applied to 'over-time' employees). At this point you should see that your logic needs to be made side effect free, encapsulated, and recombinable with other logic. Now you have the specification. As a side note, I can't see why you would want to use this pattern in a more dynamic and functional language like lisp.
The distinction between this and [[Interpreter pattern]] is unclear to me. Perhaps this is a special case of Interpreter? [[User:Dubwai|Dubwai]] ([[User talk:Dubwai|talk]]) 22:03, 25 January 2008 (UTC)▼
:--[[User:Wavell2003|Wavell2003]] ([[User talk:Wavell2003|talk]]) 15:09, 20 March 2008 (UTC)
:: Of course I would use this pattern in a functional language. It's just not as apparent, because you can do it in a few lines of code instead of a mess like the one we have right now. ("simplified"... yeah...) But I am torn up if replacing the code with a shorter, clearer, functional variant would be a good idea, as fewer people understand Lisp or Haskell. --[[Special:Contributions/47.70.172.238|47.70.172.238]] ([[User talk:47.70.172.238|talk]]) 01:28, 20 November 2015 (UTC)
▲
[[User:Dubwai|Dubwai]] ([[User talk:Dubwai|talk]]) 22:03, 25 January 2008 (UTC)
:The Interpreter pattern allows for a lot more than just chaining of Boolean logic. In the Interpreter pattern you have the ability to parse strings and apply whatever logic you want (not just boolean) to the classes that are created. The Specification pattern is more similar to the strategy pattern.
:--[[User:Wavell2003|Wavell2003]] ([[User talk:Wavell2003|talk]]) 15:09, 20 March 2008 (UTC)
:-- Second that [[User:Dubwai|Dubwai]] The Specification as explained here is special case of Interpreter. To quote the first article from the list "This effectively creates an interpreter [Gang of Four] for the specification. The "language" being interpreted allows us to describe a composite specification." and connection with Interpreter should be made clear. <small class="autosigned">— Preceding [[Wikipedia:Signatures|unsigned]] comment added by [[Special:Contributions/190.21.127.98|190.21.127.98]] ([[User talk:190.21.127.98|talk]]) 18:17, 27 December 2014 (UTC)</small><!-- Template:Unsigned IP --> <!--Autosigned by SineBot-->
== UML diagram ==
I've created a PNG image of the UML diagram using Dia specifically for this page. Use it if you like.
[[Image:Specification UML.png]]
--[[User:IToshkov|IToshkov]] ([[User talk:IToshkov|talk]]) 11:47, 11 November 2008 (UTC)
Shouldn't the lower right-hand class be labelled ''NotSpecification''? --[[Special:Contributions/132.181.52.8|132.181.52.8]] ([[User talk:132.181.52.8|talk]]) 05:02, 2 July 2009 (UTC)
:Second that. <span style="font-size: smaller;" class="autosigned">— Preceding [[Wikipedia:Signatures|unsigned]] comment added by [[Special:Contributions/190.21.189.24|190.21.189.24]] ([[User talk:190.21.189.24|talk]]) 20:58, 30 June 2011 (UTC)</span><!-- Template:UnsignedIP --> <!--Autosigned by SineBot-->
== Content Doesn't make sense ==
The text is confusing at one point, and talks about a previously implemented class, which is not linked or shown anywhere. It looks like this may be copied from some other source, and as such may be plagerized.
"We previously defined an OverdueSpecification class" <span style="font-size: smaller;" class="autosigned">— Preceding [[Wikipedia:Signatures|unsigned]] comment added by [[Special:Contributions/75.146.43.241|75.146.43.241]] ([[User talk:75.146.43.241|talk]]) 21:34, 26 July 2012 (UTC)</span><!-- Template:Unsigned IP --> <!--Autosigned by SineBot-->
== External links modified ==
Hello fellow Wikipedians,
I have just added archive links to {{plural:1|one external link|1 external links}} on [[Specification pattern]]. Please take a moment to review [https://en.wikipedia.org/w/index.php?diff=prev&oldid=706406351 my edit]. If necessary, add {{tlx|cbignore}} after the link to keep me from modifying it. Alternatively, you can add {{tlx|nobots|deny{{=}}InternetArchiveBot}} to keep me off the page altogether. I made the following changes:
*Added archive https://web.archive.org/20110724151447/http://www.dpdk.nl/opensource/specification-pattern-for-selection-on-lists to http://www.dpdk.nl/opensource/specification-pattern-for-selection-on-lists
When you have finished reviewing my changes, please set the ''checked'' parameter below to '''true''' to let others know.
{{sourcecheck|checked=false}}
Cheers.—[[User:Cyberbot II|<sup style="color:green;font-family:Courier;">cyberbot II</sup>]]<small><sub style="margin-left:-14.9ex;color:green;font-family:Comic Sans MS;">[[User talk:Cyberbot II|<span style="color:green;">Talk to my owner</span>]]:Online</sub></small> 03:58, 23 February 2016 (UTC)
== Comparison with false ==
I'm no C# guru but wouldn't one prefer to write
... && !currentInvoice.NoticeSent && ...
instead of
... && currentInvoice.NoticeSent == false && ...
? [[User:Uligerhardt|Uligerhardt]] ([[User talk:Uligerhardt|talk]]) 08:58, 10 March 2016 (UTC)
|