<commit_before><section>
	<section>
		<h2>Liskov Substitution Principle</h2>
		<p>
            <q>&ldquo;Subtype Requirement: Let <code>f(x)</code> be a property provable about objects <code>x</code> of type <code>T</code>. Then <code>f(y)</code> should be true for objects <code>y</code> of type <code>S</code> where <code>S</code> is a subtype of <code>T</code>.&rdquo;</q>
        </p>
        <p>
            <small><em>&mdash; <NAME>, Data abstraction and hierarchy, 1987</em></small>
        </p>
	</section>
	<section>
		<img src="images/scrubs-head-explodes.gif">
	</section>
	<section>
		<h3>Simplificando un poco...</h3>
		<p class="fragment">Siendo <code>X</code> un subtipo <code>T</code></p>
		<p class="fragment"><code>X</code> tiene que poder ser usada donde se requiera <code>T</code></p>
		<p class="fragment"><strong>Sin alterar el correcto funcionamiento del programa</strong></p>
	</section>
	<section>
		<h3>¿Mejor?</h3>
		<img class="fragment" src="images/kinda-misfits.gif">
	</section>
	<section>
		<h3>¿Cómo logramos esto?</h3>
		<ul>
			<li class="fragment"><big><strong>interfaces</strong> <i class="fa fa-star yellow"></i> / Clases abstractas</big></li>
			<li class="fragment"><big><strong>Precondiciónes</strong> igual o más restrictivas</big></li>
			<li class="fragment"><big><strong>Postcondiciónes</strong> igual o menos restrictivas</big></li>
		</ul>
	</section>
	<section>
		<h3>En el ejemplo anterior teníamos</h3>
		<ul>
			<li class="fragment"><code>HtmlRenderer</code></li>
			<li class="fragment"><code>JsonRenderer</code></li>
			<li class="fragment"><code>XmlRenderer</code></li>
		</ul>
		<p class="fragment">Todas subtipos de <code>Renderer</code></p>
		<p class="fragment">Sus <em>pre</em> y <em>post</em> condiciónes igual de restrictivas</p>
	</section>
	<section><commit_msg>Case: Interfaces!<commit_after><section>
	<section>
		<h2>Liskov Substitution Principle</h2>
		<p>
            <q>&ldquo;Subtype Requirement: Let <code>f(x)</code> be a property provable about objects <code>x</code> of type <code>T</code>. Then <code>f(y)</code> should be true for objects <code>y</code> of type <code>S</code> where <code>S</code> is a subtype of <code>T</code>.&rdquo;</q>
        </p>
        <p>
            <small><em>&mdash; <NAME>, Data abstraction and hierarchy, 1987</em></small>
        </p>
	</section>
	<section>
		<img src="images/scrubs-head-explodes.gif">
	</section>
	<section>
		<h3>Simplificando un poco...</h3>
		<p class="fragment">Siendo <code>X</code> un subtipo <code>T</code></p>
		<p class="fragment"><code>X</code> tiene que poder ser usada donde se requiera <code>T</code></p>
		<p class="fragment"><strong>Sin alterar el correcto funcionamiento del programa</strong></p>
	</section>
	<section>
		<h3>¿Mejor?</h3>
		<img class="fragment" src="images/kinda-misfits.gif">
	</section>
	<section>
		<h3>¿Cómo logramos esto?</h3>
		<ul>
			<li class="fragment"><big><strong>Interfaces</strong> <i class="fa fa-star yellow"></i> / Clases abstractas</big></li>
			<li class="fragment"><big><strong>Precondiciónes</strong> igual o más restrictivas</big></li>
			<li class="fragment"><big><strong>Postcondiciónes</strong> igual o menos restrictivas</big></li>
		</ul>
	</section>
	<section>
		<h3>En el ejemplo anterior teníamos</h3>
		<ul>
			<li class="fragment"><code>HtmlRenderer</code></li>
			<li class="fragment"><code>JsonRenderer</code></li>
			<li class="fragment"><code>XmlRenderer</code></li>
		</ul>
		<p class="fragment">Todas subtipos de <code>Renderer</code></p>
		<p class="fragment">Sus <em>pre</em> y <em>post</em> condiciónes igual de restrictivas</p>
	</section>
	<section>
{'fraction_non_alphanumeric': 0.19978106185002736, 'fraction_numerical': 0.007662835249042145, 'mean_word_length': 4.554711246200608, 'pattern_counts': {'":': 0, '<': 233, '<?xml version=': 0, '>': 233, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5592412', 'n_tokens_mistral': 1416, 'n_tokens_neox': 1321, 'n_words': 292}