見出し画像

時間芸術としての天丼(190212)

本日の日報記です。昨日はいろいろ書きすぎてだるくなってしまったのでさぼってしまいました。

2時:
起床。
弊社では週に1度朝会をやっている。
最近の目玉コーナーは「改めまして自己紹介」のコーナーだ。
その会では既に知り合っている同僚たちに自分を改めて自己紹介をすることになっていて、先週回で幸運にもその時のスピーカーと目が合ってしまい、この日のスピーカーとして自己紹介をする運びとなった。その準備を一切してなかったのでこの時間に起きた(今振り返ると張り切りすぎだったようだ。スピーチ時間は1分が目安だったらしい)
怪事件について話すつもりだったので「フィラデルフィア実験」についてスピーチをまとめた。荒唐無稽な与太話を話すのは結構楽しい。

ちなみに僕は職場では「ポン太郎」と呼ばれている。別に仕事ができないからではない。いや、できないのだが、できないから「ポン太郎」と呼ばれているわけではない。以前「ごま油ポン太郎」というキャラを作っていたことをアイデンティティにしていたら、いつのまにか僕が「ポン太郎」となってしまった。
「ポン太郎、これやっといてー」「承知しましたー」みたいなやりとりが時たまあるのだが、はたから聞いていると、「ポン太郎」と呼ばれる人間の仕事のアウトプット、どう考えても不安になってしまうよな、と考えてしまう。「ポン太郎」と呼ばれている人間、どうかんがえてもポンコツだろうな、響き的に。

8時半:
かなり早めの出社。画像を並べたスライドをまとめる。
プロジェクトのissueを2つ片づけてごきげんになる。

13時:
わけあって裁縫をすることになる。
もちろん業務の一環。
10年ぶりに針と糸を触ったので疲れた。
本返し縫いを体得する。

18時半:
荷物の受け取りを思い出し即帰宅。

19時半:
まだ届いてないといいが、と思いつつ到着。
わいわいさんの動画を見ながらご飯食べる。

高校の時見てから割とずっと見てる気がする。7年ぐらいか。

21時:
友達と部活(PUBG)をやる。
ヌメッとした死に方で後味が悪い死に方をしてしまった。
ドン勝するまで頑張るぞ。

23時半:
アライグマのモデリング。

サブディビかけるとこんな感じ。

手と耳が小さいが、少しずつ形にはなってきた。
メッシュの分割とかきっとセオリー的にはめちゃくちゃなんだろうが、素人過ぎてわからないので構わず晒す。

番外編:
昨日書いたコード。

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

/// <summary>
/// 資金繰りに応じて、作る駄菓子のサイズが変わるプログラム。
/// FactoryMethodとStateの練習
/// </summary>
public class CompanyStateSample : MonoBehaviour
{

    void Start()
    {
        float[] valuationBasis = new float[2] { 100f, 1000f }; 
        Company company = new OmochiCompany(222f,valuationBasis);
        company.EarnMoney(100f);
        company.SpendMoney(300f);
        company.EarnMoney(1000f);
        company.SpendMoney(800f);
    }

    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
    
}

/// <summary>
/// "ConcreteContext"クラス
/// </summary>
class CakeCompany : Company
{
    public CakeCompany(float amount, float[] valuationbasis)
    {
        FundState = new UnKnownState(amount,this,valuationbasis);
    }
}
class OmochiCompany : Company
{
    public OmochiCompany(float amount, float[] valuationbasis)
    {
        FundState = new UnKnownState(amount, this, valuationbasis);
    }
}

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

    private float _fund;
    private Company _company;

    #region PublicProperties

    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 DecreaseFund(float amount)
    {
        Fund -= amount;
        if (Fund < 0f)
        {
            Fund = 0f;
            Debug.Log("お金を使い果たした。");
        }
        
        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(this);
        }
        else if (Fund < ValuationBasis[1])
        {
            Company.FundState = new NormalFundState(this);
        }
        else
        {
            Company.FundState = new GoodFundState(this);
        }
    }
    #endregion
}

/// <summary>
/// "ConcreteState"クラス。
/// </summary>
class GoodFundState : FundState
{
    public GoodFundState(FundState state) : this(state.Fund,state.Company,state.ValuationBasis)
    {
    }
    public GoodFundState(float companyFund, Company thisCompany, float[] valuationBasis)
    {
        Fund = companyFund;
        Company = thisCompany;
        ValuationBasis = valuationBasis;
    }
}
class NormalFundState : FundState
{
    public NormalFundState(FundState state) : this(state.Fund, state.Company, state.ValuationBasis)
    {
    }
    public NormalFundState(float companyFund, Company thisCompany, float[] valuationBasis)
    {
        Fund = companyFund;
        Company = thisCompany;
        ValuationBasis = valuationBasis;
    }
}
class BadFundState : FundState
{
    public BadFundState(FundState state) : this(state.Fund, state.Company, state.ValuationBasis)
    {
    }
    public BadFundState(float companyFund, Company thisCompany, float[] valuationBasis)
    {
        Fund = companyFund;
        Company = thisCompany;
        ValuationBasis = valuationBasis;
    }
}
class UnKnownState : FundState
{
    public UnKnownState(FundState state) : this(state.Fund, state.Company, state.ValuationBasis)
    {
    }
    public UnKnownState(float companyFund, Company thisCompany, float[] valuationBasis)
    {
        Fund = companyFund;
        Company = thisCompany;
        ValuationBasis = valuationBasis;
    }
}

前回書いたやつの続き。
結構根性使って踏ん張ったけど、くっそ例外でまくってそれの修正に時間かかって疲れちゃった。やっぱ妥協的に生まれたコードもある。(UnKnownStateとか。ある種の初期化用に書いてしまった結果なのでクソ)
例外吐きまくった原因はStateが切り替わるときに前回のStateの情報が新しいやつにわたってなかったから。オーバーロードさせたコンストラクタで解決。(そんなのあるんだ~ってなった)Stateパターンで書くときに各Stateクラスがなんらかのプロパティやらを持ってるときは(場合によるにせよ)ちゃんと情報を引き継がせなきゃダメ~ってのが教訓。

次こそはこれにFactoryMethod絡めるぞ。(それが正しい設計かどうかは練習なのでさておき)

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

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