<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>目指せ上流 &#8211; エンジニア見習い</title>
	<atom:link href="https://otonan-syusyoku.work/archives/category/learning/i-wana-se/feed" rel="self" type="application/rss+xml" />
	<link>https://otonan-syusyoku.work</link>
	<description>三流プログラマー</description>
	<lastBuildDate>Mon, 05 Jun 2023 15:24:21 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://otonan-syusyoku.work/wp-content/uploads/2023/10/cropped-名称未設定のデザイン-16-32x32.png</url>
	<title>目指せ上流 &#8211; エンジニア見習い</title>
	<link>https://otonan-syusyoku.work</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【クリーンアキテクチャ】SOLID原則の依存性反転の原則を学ぶ</title>
		<link>https://otonan-syusyoku.work/archives/1360</link>
					<comments>https://otonan-syusyoku.work/archives/1360#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Mon, 05 Jun 2023 15:19:41 +0000</pubDate>
				<category><![CDATA[生涯独学]]></category>
		<category><![CDATA[目指せ上流]]></category>
		<category><![CDATA[実務]]></category>
		<category><![CDATA[脱3流プログラマー]]></category>
		<category><![CDATA[設計]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=1360</guid>

					<description><![CDATA[Contents SOLID原則を学んでいますまずはInterfaceからいよいよ依存性反転の原則SOLID原則を学んでいます 「Software Design (ソフトウェアデザイン) 2023年6月号 [雑誌]」とい [&#8230;]]]></description>
										<content:encoded><![CDATA[<div id="rtoc-mokuji-wrapper" class="rtoc-mokuji-content frame4 preset3 animation-fade rtoc_open noto-sans" data-id="1360" data-theme="BlogArise">
			<div id="rtoc-mokuji-title" class=" rtoc_center">
			<button class="rtoc_open_close rtoc_open"></button>
			<span>Contents</span>
			</div><ol class="rtoc-mokuji decimal_ol level-1"><li class="rtoc-item"><a href="#rtoc-1">SOLID原則を学んでいます</a></li><li class="rtoc-item"><a href="#rtoc-2">まずはInterfaceから</a></li><li class="rtoc-item"><a href="#rtoc-3">いよいよ依存性反転の原則</a></li></ol></div><h2 id="rtoc-1" >SOLID原則を学んでいます</h2>
<p>「<a href="//af.moshimo.com/af/c/click?a_id=2019667&amp;p_id=170&amp;pc_id=185&amp;pl_id=4062&amp;url=https%3A%2F%2Fwww.amazon.co.jp%2Fdp%2FB0C4K9X2XV" rel="nofollow" referrerpolicy="no-referrer-when-downgrade">Software Design (ソフトウェアデザイン) 2023年6月号 [雑誌]</a>」という雑誌に出会ったので、SOLID原則を学習中です。これを機に3流プログラマーに慣れたらいいなぁと。</p>
<p>前回の学習内容はこちら</p>
<p>[getpost id=&#8221;1332&#8243; cat_name=&#8221;1&#8243; date=&#8221;0&#8243;]</p>
<p>&nbsp;</p>
<h2 id="rtoc-2" >まずはInterfaceから</h2>
<p>PHPにおけるInterface（インターフェース）は、クラスが実装するべきメソッドのシグネチャ（メソッド名、引数、戻り値の型）を定義するための機能です。</p>
<p>Interfaceは抽象的なクラスであり、実際の実装を持ちません。<br />
(じゃあいらんやん&#8230;って思っちゃいますよね)</p>
<p>&nbsp;</p>
<p>なぜ必要なのかというと、<br />
<strong>クラスはInterfaceを実装することで、そのInterfaceで定義されたメソッドを必ず実装しなければならないからです。</strong></p>
<p>例えば、ユーザーにメッセージを送信する場面を考えて下さい。</p>
<p>どの様なメッセンジャーを使うにしても必ず「<strong>メッセージを生成する機能</strong>」と「<strong>メッセージを送信する機能</strong>」の2つが必要になるはずです。</p>
<p>ここではメールで送信する場合(メールクラス)とLineで送信する場合(Lineクラス)を想定してみます。</p>
<p>interfaceを以下のように定義することで、実装したクラスは<strong>interfaceの内容を必ず実装しなければいけません。</strong></p>
<pre class="line-numbers"><code class="language-php">interface Message {
    public function createMesseage();
    public function sendMessage();
}</code></pre>
<p>上記の様に定義することで、メールクラスとLineクラスは必ず同じメソッドがある事が担保されます。(<strong>クラスは同じ振る舞いを持つことが保証されます</strong>)</p>
<p>仮にSlackでメッセージを送信したい場合、Slackクラスに同じメソッドを実装するだけで済むため拡張性が高くなりますよね。あら、わかりやすい。笑<br />
(既存のクラス(メールクラス、Lineクラス)に影響なく実装できる)</p>
<pre class="line-numbers"><code class="language-php">class Mail implements Message {
    public function createMessage() {
        //処理    
    }

    public function sendMessage() {
        //処理   
    }
}

class Line implements Message {
    public function createMessage() {
        //処理    
    }

    public function sendMessage() {
        //処理   
    }
}

interface Message {
    public function createMessage() {}
    public function sendMessage() {}
}</code></pre>
<h2 id="rtoc-3" >いよいよ依存性反転の原則</h2>
<p>一旦、呼び出し元の観点を持ってみましょう。</p>
<p>interfaceを実装することで、呼び出し元のコードはinterfaceに対して依存し、具体的な実装クラスに対して依存しないためコードの結合が低くなります(疎結合。。。)</p>
<p><img decoding="async" src="https://otonan-syusyoku.work/wp-content/uploads/2023/06/呼び出し元-300x150.png" alt="依存性反転の原則" width="300" height="150" class="aligncenter wp-image-1363 size-medium" srcset="https://otonan-syusyoku.work/wp-content/uploads/2023/06/呼び出し元-300x150.png 300w, https://otonan-syusyoku.work/wp-content/uploads/2023/06/呼び出し元-768x384.png 768w, https://otonan-syusyoku.work/wp-content/uploads/2023/06/呼び出し元.png 1000w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<p>先程のコードで考えると呼び出し元はメールクラスを呼び出しているつもりでもinterfaceを経由しているのが実態です。</p>
<p>Interfaceを使用することで、クラス間の依存関係を抽象化し、実装にではなくインターフェースに依存するようにすることができます。</p>
<ul>
<li>呼び出し元の見ているところがinterfaceになる</li>
<li>interfaceは定義する場所</li>
<li>interfaceを継承したクラスは必ず同じメソッドある</li>
<li>結果、呼び出し元と実装クラスはinterfaceに依存している</li>
</ul>
<p>これにより、依存性反転原則が達成されます。</p>
<p>&nbsp;</p>
<p>ちゃんちゃん。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/1360/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【クリーンアキテクチャ】SOLID原則の単一責任の原則を学ぶ</title>
		<link>https://otonan-syusyoku.work/archives/1332</link>
					<comments>https://otonan-syusyoku.work/archives/1332#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Sun, 28 May 2023 13:51:08 +0000</pubDate>
				<category><![CDATA[生涯独学]]></category>
		<category><![CDATA[目指せ上流]]></category>
		<category><![CDATA[設計]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=1332</guid>

					<description><![CDATA[Contents 先輩から雑誌を渡されたSOLID原則を簡単に単一責任の原則先輩から雑誌を渡された これから設計に関する知識も増やしていきたいな〜と思っていた矢先、「Software Design (ソフトウェアデザイン [&#8230;]]]></description>
										<content:encoded><![CDATA[<div id="rtoc-mokuji-wrapper" class="rtoc-mokuji-content frame4 preset3 animation-fade rtoc_open noto-sans" data-id="1332" data-theme="BlogArise">
			<div id="rtoc-mokuji-title" class=" rtoc_center">
			<button class="rtoc_open_close rtoc_open"></button>
			<span>Contents</span>
			</div><ol class="rtoc-mokuji decimal_ol level-1"><li class="rtoc-item"><a href="#rtoc-1">先輩から雑誌を渡された</a></li><li class="rtoc-item"><a href="#rtoc-2">SOLID原則を簡単に</a></li><li class="rtoc-item"><a href="#rtoc-3">単一責任の原則</a></li></ol></div><h2 id="rtoc-1" >先輩から雑誌を渡された</h2>
<p>これから設計に関する知識も増やしていきたいな〜と思っていた矢先、「<a href="//af.moshimo.com/af/c/click?a_id=2019667&amp;p_id=170&amp;pc_id=185&amp;pl_id=4062&amp;url=https%3A%2F%2Fwww.amazon.co.jp%2Fdp%2FB0C4K9X2XV" rel="nofollow" referrerpolicy="no-referrer-when-downgrade">Software Design (ソフトウェアデザイン) 2023年6月号 [雑誌]</a>」という書籍に出会いました。中々嬉しいタイミングですね！笑</p>
<p>いわゆるクリーンアーキテクチャに関する内容が紹介されている雑誌になります。</p>
<p>&nbsp;</p>
<p>今回はシリーズ形式で各記事に分けて書いていこうと思います〜！</p>
<p>&nbsp;</p>
<h2 id="rtoc-2" >SOLID原則を簡単に</h2>
<ol>
<li>単一責任の原則 (Single Responsibility Principle, SRP)</li>
<li>オープン/クローズドの原則 (Open/Closed Principle, OCP)</li>
<li>リスコフの置換原則 (Liskov Substitution Principle, LSP)</li>
<li>インターフェース分離の原則 (Interface Segregation Principle, ISP)</li>
<li>依存性逆転の原則 (Dependency Inversion Principle, DIP)</li>
</ol>
<h2 id="rtoc-3" >単一責任の原則</h2>
<p>SRP : Single Responsibility Principle</p>
<p>一言で表すとクラスは単一の責務を持つべきということらしいです。</p>
<p>もっと噛み砕くと1つのクラスが1つの目的や責務にのみ集中するべきことを指します.</p>
<pre class="line-numbers"><code class="language-php">//良くない設計
&lt;?php
class DB {
	private $host;
	private $dbName;
	private $userName;
	private $password;
	
	public function __construct($name, $email) {
		$this-&gt;host = env('host');
		$this-&gt;dbName = env('dbName');
		$this-&gt;userName = env('userName');
		$this-&gt;password = env('password');
		
		try {
			$database_handler = new PDO('mysql:host=' . $this-&gt;host . ':3306;dbname=' . $this-&gt;dbName . ';charset=utf8mb4', $this-&gt;userName, $this-&gt;password);
		} 
    	catch (PDOException $e) {   
        	echo $e-&gt;getMessage() . "\n";
        	exit;
    	}  
	}
	
	public static function selectUser() {
		$PDO = $db = new self();
		
		//取得処理	
	}
	
	public static function editAdmin() {
		$PDO = $db = new self();
		
		//編集処理	
	}
}
?&gt;</code></pre>
<p>&nbsp;</p>
<p>上記のコードではDBクラスを定義しているのですが、ユーザーの取得処理と管理者の編集処理を記述しています。</p>
<p>理想とするクラス設計では、ユーザーのクラス/管理者のクラスという形で分けるべきですよね。↓</p>
<p>DB接続クラス</p>
<pre class="line-numbers"><code class="language-php">class DB {
	private $host;
	private $dbName;
	private $userName;
	private $password;
	
	public function __construct($name, $email) {
		$this-&gt;host = env('host');
		$this-&gt;dbName = env('dbName');
		$this-&gt;userName = env('userName');
		$this-&gt;password = env('password');
		
		try {
			$database_handler = new PDO('mysql:host=' . $this-&gt;host . ':3306;dbname=' . $this-&gt;dbName . ';charset=utf8mb4', $this-&gt;userName, $this-&gt;password);
		} 
    	catch (PDOException $e) {   
        	echo $e-&gt;getMessage() . "\n";
        	exit;
    	}  
	}
}</code></pre>
<p>ユーザクラス（管理者も同様に）</p>
<pre class="line-numbers"><code class="language-php">class User {
	public static function selectUser() {
		$PDO = $db = new self();
		
		//取得処理	
	}

	//他のユーザーに関する処理を記述していく
}</code></pre>
<p>良くないコード例として出したソースは以前の現場で書いていた手法なんですよね。笑<br />
DBクラスの内容が1000以上になっていたので、拡張性や保守性がかなり良くない事が単一責任の原則を学んで理解できたので良しとしましょう。</p>
<p>ちなみに前の現場で書いていた内容はいつか爆発することは目に見えているのですが、爆破する前に逃げ出すことが出来ました。笑</p>
<p>[getpost id=&#8221;1204&#8243; cat_name=&#8221;1&#8243; date=&#8221;0&#8243;]</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/1332/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
