見出し画像

時間芸術としての天丼(日報記190210)

本日の日報記です。(翌日早起きする予定なので今日はやっつけ文章)

10時半:
起床。

11時半:
早めの昼食。パンとリンゴ。
ベースをしばき倒す。

14時半:
モブサイコ視聴が止まらなくなる。
ほとんど一気に二期の現在netflixで公開されているところまで観る。
「一気に二期」は僕なりのユーモアです。
(くそつまらない人間が落とされる地獄行き)

21時半:
友達と部活(PUBG)
大会に出ることにした。部活かよ。

23時:
昨日やってたStateパターンの実践。
FuctoryMethodと合わせて、「資金状況によって作成するプロダクトが変わる」サンプルを書こうとしたが、思ったより時間がかかった上にStateもちょい中途半端なところで混乱した上に睡魔に負けた。ConcreteContextがConcreteStateを保持してない状態でどうやって初動を入らせようかで混乱してしまっているので(EvaluateImmediately()というヤケクソな一文がそれを物語っている)、いったん寝る。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class CompanyStateSample : MonoBehaviour
{

    void Start()
    {

    }

    void Update()
    {

    }
}

// State Pattern //

/// <summary>
/// "Context"クラス。このプログラムでいうところの会社を表す
/// </summary>
abstract class Company
{
    private FundState _fundState;

    public FundState FundState
    {
        get { return _fundState; }
        set
        {
            _fundState = value;
            Debug.Log("CurrentState is " + _fundState.GetType().Name);
        }
    }
    #region PublicMethods

    public void SpendMoney(float amount)
    {
        FundState.DecreaseFund(amount);
    }
    public void EarnMoney(float amount)
    {
        FundState.IncreaseFund(amount);
    }
    #endregion
    #region
    // 妥協の産物
    protected void EvaluateImmediately()
    {
        FundState.EvaluateFundState();
    }
    #endregion
}

/// <summary>
/// "ConcreteContext"クラス
/// </summary>
class CakeCompany : Company
{
    public CakeCompany(float amount, int[] valuationbasis)
    {
        EvaluateImmediately();
    }
}
class OmochiCompany : Company
{
    public OmochiCompany(float amount, int[] valuationbasis)
    {

    }
}

/// <summary>
/// "State"クラス。会社は何であれ、財務状況を表す。
/// </summary>
abstract class FundState
{
    private int[] _valuationBasis;
    private float _fund;
    private Company _company;

    #region PublicProperties
    public int[] ValuationBasis
    {
        get { return _valuationBasis; }
        set
        {
            // 評価基準が細かくなるのであれば当然forで書くなどの対応が必要
            // 今は数が少ないので読みずらくなるだけ感
            if (value[0] < value[1] && value[0] < value[2])
            {
                _valuationBasis[0] = value[0];
            }
            if (value[1] < value[2])
            {
                _valuationBasis[1] = value[1];
            }
            _valuationBasis[2] = value[2];

        }
    }

    public float Fund
    {
        get { return _fund; }
        set
        {
            if (value >= 0)
            {
                _fund = value;
            }
        }
    }

    public Company Company
    {
        get { return _company; }
        set { _company = value; }
    }
    #endregion

    #region PublicMethods
    public void Initialize(float amount, Company company, int[] valuationbasis)
    {
        Fund = amount;
        Company = company;
        ValuationBasis = valuationbasis;
        EvaluateFundState();
    }
    public void DecreaseFund(float amount)
    {
        Fund -= amount;
        if (Fund < 0f)
        {
            Fund = 0f;
        }

        EvaluateFundState();
        Debug.Log("お金を使った。今の資金は" + Fund + "円");
    }
    public void IncreaseFund(float amount)
    {
        Fund += amount;

        EvaluateFundState();
        Debug.Log("お金を稼いだ。今の資金は " + Fund + "円");
    }
    public void EvaluateFundState()
    {
        if (Fund < ValuationBasis[0])
        {
            Company.FundState = new BadFundState(Fund, Company, ValuationBasis);
        }
        else if (Fund < ValuationBasis[1])
        {
            Company.FundState = new NormalFundState(Fund, Company, ValuationBasis);
        }
        else
        {
            Company.FundState = new GoodFundState(Fund, Company, ValuationBasis);
        }
    }
    #endregion
}

/// <summary>
/// "ConcreteState"クラス。
/// </summary>
class GoodFundState : FundState
{
    public GoodFundState(float amount, Company company, int[] valuationBasis)
    {
        Initialize(amount, company, valuationBasis);
    }
}
class NormalFundState : FundState
{
    public NormalFundState(float amount, Company company, int[] valuationBasis)
    {
        Initialize(amount, company, valuationBasis);
    }
}
class BadFundState : FundState
{
    public BadFundState(float amount, Company company, int[] valuationBasis)
    {
        Initialize(amount, company, valuationBasis);
    }
}

そういえば良さそうな本見つけた。

幼児退行してる三流プログラマなので「ママー!これ買って!」と言うお気持ちが高まる。来月買うか...

明日もよろしくお願いします。

この記事が気に入ったらサポートをしてみませんか?