Skip to content

Commit

Permalink
Add bike shed and Option<T>
Browse files Browse the repository at this point in the history
  • Loading branch information
akimboyko committed Oct 11, 2013
1 parent 16ed6b0 commit a367485
Show file tree
Hide file tree
Showing 4 changed files with 133 additions and 31 deletions.
107 changes: 76 additions & 31 deletions Presentation/architectural_validation_in_dotnet.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<meta charset="utf-8" />
<meta name="viewport" content="width=1024" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<title>Architectural Validation in .Net by @AkimBoyko</title>
<title>Architecture and Design Validation in .Net by @AkimBoyko</title>

<meta name="description" content="Architectural Validation in .Net: Reflection, RoslynCTP, PostSharp" />
<meta name="author" content="Akim Boyko" />
Expand All @@ -28,7 +28,7 @@
<!-- Title -->

<div id="title" class="step" data-x="-200" data-y="0" data-z="0" data-rotate="0" data-scale="4">
<h1>Architectural Validation in .Net</h1>
<h1>Architecture and Design Validation in .Net</h1>
<div class='right'>
<p><a href='https://twitter.com/AkimBoyko'>@AkimBoyko</a></p>
<p class='right'><a href="https://github.com/akimboyko/MetaProgramming">MetaProgramming@GitHub</a></p>
Expand Down Expand Up @@ -60,6 +60,25 @@ <h1>Validation</h1>
<p>Anything that can go wrong will go wrong<br/>by <em>Edward Aloysius Murphy</em></p>
</div>

<div id="ParkinsonsLawOfTriviality" class="step" data-x="+2500" data-y="+1500" data-z="0" data-rotate="0" data-scale="1">
<h1>Parkinson's law of triviality</h1>
<p>Organizations give disproportionate weight to trivial issues<br/>by <em>Cyril Northcote Parkinson</em></p>
</div>

<div id="ParkinsonsLawOfTrivialitySample01" class="step" data-x="+2500" data-y="+2250" data-z="0" data-rotate="0" data-scale="1">
<ul>
<li>The first is the signing of a <strong>£10 000 000</strong> contract to build a reactor (<em>2 min</em>)</li>
<li>the second a proposal to build a <strong>£350</strong> bicycle shed for the clerical staff (<em>45 min, save ~50£</em>)</li>
</ul>
</div>

<div id="ParkinsonsLawOfTrivialitySample02" class="step" data-x="+2500" data-y="+3000" data-z="0" data-rotate="0" data-scale="1">
<div class="center">
<img src='images/FreeBSD-No-Bikeshed.png' width="600px" alt='FreeBSD not bikeshad' />
<p>more at <a href='http://bikeshed.com/'>bikeshed.com</a></p>
</div>
</div>

<!-- WHY -->

<div id="Why" class="step" data-x="+4000" data-y="-850" data-z="0" data-rotate="0" data-scale="1">
Expand Down Expand Up @@ -98,6 +117,14 @@ <h1>Fail fast!</h1>
failure or condition that is likely to lead to failure</p>
</div>

<div id="TDDvsADD" class="step" data-x="+4000" data-y="+1500" data-z="0" data-rotate="0" data-scale="1">
<h1>Test Drive the System Architecture</h1>
<strong>Test Driven Development</strong>
<p>First we'll solve the "<u>that works</u>" part of the problem, then we'll solve the "<u>clean code</u>" part</p>
<strong>Architecture Driven Development</strong>
<p>Solve "<u>clean code</u>" first, then scramble around trying to integrate into the design the things you learn as you solve the "<u>that works</u>" problem</p>
</div>

<!-- Reflection and Introspection -->

<div id="ReflectionVsIntrospection" class="step" data-x="+5500" data-y="-750" data-z="0" data-rotate="0" data-scale="1">
Expand Down Expand Up @@ -142,42 +169,72 @@ <h1>Search for <code class="inlineCode">return default(T);</code></h1>
|| semanticModel.GetTypeInfo(expressionSyntax).Type.IsReferenceType);</pre></div>
</div>

<div id="NullAndOption" class="step" data-x="+5500" data-y="+2150" data-z="0" data-rotate="0" data-scale="1">
<h1><code class="inlineCode">Option&lt;T&gt;</code> instead of <code class="inlineCode">Null</code></h1>
<div class="code">
<pre class="code_block"><span style="color: #0000ff">enum</span> OptionType { Some, None };
<span style="color: #0000ff">abstract</span> <span style="color: #0000ff">class</span> <span style="color: #2b91af">Option</span>&lt;T&gt; {
<span style="color: #008000">/* … */</span>
<span style="color: #0000ff">public</span> OptionType Tag { <span style="color: #0000ff">get</span> { <span style="color: #0000ff">return</span> tag; } }
}

<span style="color: #0000ff">class</span> <span style="color: #2b91af">None</span>&lt;T&gt; : Option&lt;T&gt; {
<span style="color: #0000ff">public</span> None() : <span style="color: #0000ff">base</span>(OptionType.None) { }
}

<span style="color: #0000ff">class</span> <span style="color: #2b91af">Some</span>&lt;T&gt; : Option&lt;T&gt; {
<span style="color: #0000ff">public</span> Some(T <span style="color: #0000ff">value</span>) : <span style="color: #0000ff">base</span>(OptionType.Some) {
<span style="color: #0000ff">this</span>.<span style="color: #0000ff">value</span> = <span style="color: #0000ff">value</span>;
}
<span style="color: #0000ff">public</span> T Value { <span style="color: #0000ff">get</span> { <span style="color: #0000ff">return</span> <span style="color: #0000ff">value</span>; } }
}

<span style="color: #0000ff">static</span> <span style="color: #0000ff">class</span> <span style="color: #2b91af">Option</span> {
<span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> Option&lt;T&gt; None&lt;T&gt;() {
<span style="color: #0000ff">return</span> <span style="color: #0000ff">new</span> None&lt;T&gt;();
}
<span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> Option&lt;T&gt; Some&lt;T&gt;(T <span style="color: #0000ff">value</span>) {
<span style="color: #0000ff">return</span> <span style="color: #0000ff">new</span> Some&lt;T&gt;(<span style="color: #0000ff">value</span>);
}
}</pre></div>
</div>


<div id="IntrospectionAdvancedSamples01" class="step" data-x="+5500" data-y="+2150" data-z="0" data-rotate="0" data-scale="1">
<div id="IntrospectionAdvancedSamples01" class="step" data-x="+5500" data-y="+2900" data-z="0" data-rotate="0" data-scale="1">
<h1>Advanced samples</h1>
</div>

<div id="IntrospectionAdvancedSamples02" class="step" data-x="+5500" data-y="+2200" data-z="0" data-rotate="0" data-scale="1">
<div id="IntrospectionAdvancedSamples02" class="step" data-x="+5500" data-y="+2950" data-z="0" data-rotate="0" data-scale="1">
<ul>
<li><code class="inlineCode">IEnumerable&lt;T&gt;</code> or <code class="inlineCode">IQuerable&lt;T&gt;</code></li>
</ul>
</div>

<div id="IntrospectionAdvancedSamples03" class="step" data-x="+5500" data-y="+2250" data-z="0" data-rotate="0" data-scale="1">
<div id="IntrospectionAdvancedSamples03" class="step" data-x="+5500" data-y="+3000" data-z="0" data-rotate="0" data-scale="1">
<ul>
<li>Constructor-over injection or <code class="inlineCode">new</code> in constructor</li>
</ul>
</div>

<div id="IntrospectionAdvancedSamples04" class="step" data-x="+5500" data-y="+2300" data-z="0" data-rotate="0" data-scale="1">
<div id="IntrospectionAdvancedSamples04" class="step" data-x="+5500" data-y="+3050" data-z="0" data-rotate="0" data-scale="1">
<ul>
<li>Singletons</li>
</ul>
</div>

<div id="IntrospectionAdvancedSamples05" class="step" data-x="+5500" data-y="+2350" data-z="0" data-rotate="0" data-scale="1">
<div id="IntrospectionAdvancedSamples05" class="step" data-x="+5500" data-y="+3100" data-z="0" data-rotate="0" data-scale="1">
<ul>
<li>Verify declarative <code class="inlineCode">[Attribute]</code> composition</li>
</ul>
</div>

<div id="IntrospectionAdvancedSamples06" class="step" data-x="+5500" data-y="+2400" data-z="0" data-rotate="0" data-scale="1">
<div id="IntrospectionAdvancedSamples06" class="step" data-x="+5500" data-y="+3150" data-z="0" data-rotate="0" data-scale="1">
<ul>
<li><code class="inlineCode">DateTime.Now()</code></li>
<li><code class="inlineCode">DateTime.Now</code> and <code class="inlineCode">DateTime.Today</code></li>
</ul>
</div>

<div id="ReflectionLimitReferencesToAssemblies" class="step" data-x="+5500" data-y="+3000" data-z="0" data-rotate="0" data-scale="1">
<div id="ReflectionLimitReferencesToAssemblies" class="step" data-x="+5500" data-y="+3750" data-z="0" data-rotate="0" data-scale="1">
<h1>Limit references to assemblies</h1>
<p>Using <code class="inlineCode">System.Reflection</code></p>
<div class="code">
Expand Down Expand Up @@ -209,31 +266,31 @@ <h1>Limit references to assemblies</h1>
}</pre></div>
</div>

<div id="IntrospectionLimitations" class="step" data-x="+5500" data-y="+3750" data-z="0" data-rotate="0" data-scale="1">
<div id="IntrospectionLimitations" class="step" data-x="+5500" data-y="+4500" data-z="0" data-rotate="0" data-scale="1">
<h1>Limitations</h1>
<ul>
<li>C#/VB.Net source code should be available</li>
<li>Support of C# features: <code class="inlineCode">dynamic</code>, <code class="inlineCode">async</code>/<code class="inlineCode">await</code></li>
</ul>
</div>

<div id="IntrospectionAssertions" class="step" data-x="+5500" data-y="+4500" data-z="0" data-rotate="0" data-scale="1">
<div id="IntrospectionAssertions" class="step" data-x="+5500" data-y="+5250" data-z="0" data-rotate="0" data-scale="1">
<h1>Assertions</h1>
<ul>
<li>How to references back to sources?</li>
<li>What to do if source code has been changed?</li>
</ul>
</div>

<div id="IntrospectionAssertionsUsingApprovalTests" class="step" data-x="+5500" data-y="+5250" data-z="0" data-rotate="0" data-scale="1">
<div id="IntrospectionAssertionsUsingApprovalTests" class="step" data-x="+5500" data-y="+6000" data-z="0" data-rotate="0" data-scale="1">
<h1>ApprovalTests</h1>
<p>Capturing Human Intelligence</p>
<img style='margin-left: -100px;'
src='.\images\introspection_return_null_with_approvaltests.png'
alt="Introspection assertions using ApprovalTests" />
</div>

<div id="IntrospectionNote" class="step" data-x="+5500" data-y="+6000" data-z="0" data-rotate="0" data-scale="1">
<div id="IntrospectionNote" class="step" data-x="+5500" data-y="+6750" data-z="0" data-rotate="0" data-scale="1">
<p>Note: this is not a replacement for code review!</p>
</div>

Expand Down Expand Up @@ -417,23 +474,11 @@ <h1>References</h1>
}
</script>

<script type="text/javascript"
src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js">
</script>

<script type="text/javascript"
src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.23/jquery-ui.min.js">
</script>

<script type="text/javascript"
src="http://jsplumbtoolkit.com/js/jquery.jsPlumb-1.4.0-all-min.js">
</script>

<script type="text/javascript"
src="js/architectural_validation.js">
</script>

<script src="js/impress.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.9.2/jquery-ui.min.js"></script>
<script type="text/javascript" src="js/jquery.jsPlumb-1.5.2-min.js"></script>
<script type="text/javascript" src="js/architectural_validation.js"></script>
<script type="text/javascript" src="js/impress.js"></script>

<script>
jsPlumb.bind("ready", function() {
Expand Down
Binary file added Presentation/images/FreeBSD-No-Bikeshed.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 6 additions & 0 deletions Presentation/js/jquery.jsPlumb-1.5.2-min.js

Large diffs are not rendered by default.

51 changes: 51 additions & 0 deletions Snippets/Introspection/OptionTypeAndNull.linq
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<Query Kind="Program" />

// Sample from
// Real-World Functional Programming
// With examples in F# and C#
// Tomas Petricek with Jon Skeet
// http://www.manning.com/petricek/

void Main()
{
ReadInput().Dump("Option<T> read from input");
}

Option<int> ReadInput() {
string s = Util.ReadLine();
int parsed;
if (Int32.TryParse(s, out parsed))
return Option.Some(parsed);
else
return Option.None<int>();
}

enum OptionType { Some, None };
abstract class Option<T> {
private readonly OptionType tag;
protected Option(OptionType tag) {
this.tag = tag;
}
public OptionType Tag { get { return tag; } }
}

class None<T> : Option<T> {
public None() : base(OptionType.None) { }
}

class Some<T> : Option<T> {
public Some(T value) : base(OptionType.Some) {
this.value = value;
}
private readonly T value;
public T Value { get { return value; } }
}

static class Option {
public static Option<T> None<T>() {
return new None<T>();
}
public static Option<T> Some<T>(T value) {
return new Some<T>(value);
}
}

0 comments on commit a367485

Please sign in to comment.