Newer
Older
pushpullRefactoringExperiments / courseA / ProblemA1.html
<!DOCTYPE HTML>
<html lang="ja">
<head>
    <title>課題A1</title>
    <meta charset="UTF-8">
    <link rel = "stylesheet" type = "text/css" href = "../prettify.css">
</head>
<style>
    .image_size{
        width: 800px;
        height: 550px;
    }
</style>
<body>
<h1>課題A1</h1>

<hr size="5">

<h2>課題の概要</h2>

<p>
    課題A1では,StockManagement の Handling から Shipping へのデータ転送について見ていきます.
    Handling は,ユーザの入力(搬入または出庫依頼)に対する処理をまとめたクラスで,Shippingは出庫の指示を表すクラスです.<br>
    この課題では,

    <blockquote>
        <strong>「Handling の情報が更新されたときにその情報を Shipping にPUSH型で転送しているプログラムを,PULL型で転送するようにリファクタリングすること」</strong>
    </blockquote>

    を目的とします.<br>
    リファクタリングの詳しい作業手順は以下で説明します.
</p>

<hr size="5">

<h2>リファクタリング作業</h2>

<p>
    以下では,リファクタリングに要した時間を測っていただきますので,お手元に時計をご用意ください.<br>
    時間計測にあたって,急いで作業していただく必要はまったくありません.<br>
    最初の課題から最後の課題まで一定のペースを保てるよう, <font color="red">正しくリファクタリングを行うこと</font>を意識してください.<br>
    この課題で作業していただく内容は,
    <blockquote>
        <strong>「Handling の情報が更新されたときにその情報を Shipping にPUSH型で転送しているプログラムを,PULL型で転送するようにリファクタリングすること」</strong>
    </blockquote>
    です.<br>
    開発環境を立ち上げてソースコードの確認をしていただいて構いませんが,ソースコードの変更は時間計測の準備ができるまで行わないで下さい.<br>
    リファクタリングの作業手順を以下に説明します.
</p>
<p>
    まず,現時点での Handling から Shipping へのデータ転送に関するクラス図とシーケンス図を以下に示します.<br>
    <img src="../images/stock_class_push.jpg" class = "halfSize">
    <img src="../images/stock_seq_push.jpg" class = "halfSize"><br>
    現時点ではPUSH型のデータ転送で実装されているため,Handling クラスの updateAvailable() メソッドと,updateRequest() から Shipping クラスの updateHandling() メソッドを呼び出すために Handling クラスが Shipping クラスを参照しています.<br>
    ここで StockManagement クラスは,初期化時に Handling クラスや Shipping クラスのインスタンスを生成し,それらのインスタンスを関連付ける役割を担っています.<br>
    また,Handling クラスや Shipping クラスにアクセスするための入口(Facade)としての役割も担っています.<br>
    StockManagement,Handling,Shipping クラスのいずれも resources パッケージの中に入っています.<br>
</p>
<p>
    これを,以下のクラス図とシーケンス図に示すようなPUSH型のデータ転送になるよう,手作業でリファクタリングを行っていただきます.<br>
    <img src="../images/stock_class_pull.jpg" class = "halfSize">
    <img src="../images/stock_seq_pull.jpg" class = "halfSize"><br>
    今度はPULL型のデータ転送であるため,Shipping クラスの getValue() メソッドから Handling クラスの getValue() メソッドを呼び出すために Shipping クラスが Handling クラスを参照していることに注意してください.<br>
</p>
<p>
    リファクタリングの作業手順の詳細を以下に示します.<br>
    <ol>
    <li>テストプログラムを実行して正しく動作することを確認する.</li>
    <li>Shipping クラスに,Handling クラスのインスタンスを参照するフィールド Handling handling を追加する.</li>
    <li>Shipping クラスに,Handling クラスのインスタンスを引数に取るコンストラクタを追加する.</li>
    <li>Handling クラスのコンストラクタを,Shipping クラスのインスタンスを引数に取らないように書き換える.</li>
    <li>Handling クラスのフィールド shipping を削除する.</li>
    <li>StockManagement クラスのコンストラクタ内で,Shipping クラスのインスタンスが Handling クラスのインスタンスを参照するよう,インスタンスの生成順や生成方法を変更する.</li>
    <li>Shipping クラスの出庫指示の内容を保存するためのフィールド Item value を削除する.</li>
    <li>Handling クラスの updateAvailable() メソッドと updateRequest() メソッドの最後の Shipping クラスの updateHandling() メソッドの呼び出し文を削除する.</li>
    <li>Shipping クラスの getValue() メソッドを Handling クラスの getValue() メソッドを呼び出すように書き換える.</li>
    <li>Shipping クラスの updateHandling() メソッド内で行っていた,ユーザの入力に対する処理内容(ItemHandling)をもとに出庫指示の内容(Item)を作成する処理を,getValue() メソッドに移動し,出庫指示の内容を getValue() メソッドの戻り値として返すようにする.</li>
    <li>Shipping クラスの void updateHandling(ItemHandling handling) メソッドを削除する.</li>
    <li>テストプログラムを実行して正しく動作することを確認する.</li>
    </ol>
</p>
<p>
    作業に着手する前に,メッセージでお伝えした自分専用のブランチ(user??)を切って,一度プッシュを行ってください.<br>
    プッシュを行った後,開発環境の準備ができれば,<font color="red">時間計測を開始</font>してください. 時間計測はできる限り,30秒以内の単位での計測をお願いします. <br>
    テストプログラムが正しく動作するまでは作業完了とは見なされないので注意してください.
</p>

<p>
    リファクタリングの作業が完了したら作業時間を記録し,その後,作業結果を自分専用のブランチにコミット&プッシュしてください.<br>
    ただし,<font color="red">main ブランチには決してマージをしないように,また自分専用のブランチを決して削除しないように</font>注意してください. <br>
    プッシュ後に,以下のアンケートにお答えください.
</p>

<blockquote>
    <a href="https://docs.google.com/forms/d/e/1FAIpQLScnswXih-4nrtlit5vfdhouSLpM4nbMorZksfUP754ufmyOjA/viewform?usp=sf_link" target="_blank">アンケート回答</a>
</blockquote>

<hr size="5">

<p style="margin-bottom:2em;"></p>
<a href="DescriptionAlgolike.html">次へ</a>
</body>