エンジニアリングとお金の話

都内で働くエンジニアの日記です。いかに人生をお得に過ごすかをテーマに色々な情報を発信していきます。

システム設計の原則3

システム設計の原則の感想3

 型を使ってコードをわかりやすく安全にする

intやstringなどの基本データ型だけで書いたプログラムは思わぬバグを生む可能性がある。

悪い例

int amount(int price,int unit,int charge) {

  //すべて基本データ型だと例えばunitとchargeが入れ替わっても分からない
  return price * unit + charge

}

良い例

int amount(Price price,Unit unit,Charge charge) {

  //独自側を使用することで不正な値が入ることをガード出来る
  return price * unit + charge

}

コレクション型を扱うロジックを専用クラスに閉じ込める

コレクションを操作するコードがあちこちに散らばうと可読性が悪いコードになる。解決策としてコレクション型の変数を1つだけ持った専用クラスを独自に宣言する。

class Customers {
  List<Customer> customers;

  void add(Customer customer) {・・・}
  int count() {・・・}

このようにコレクション型のデータとロジックを特別扱いして、コレクションを1つだけ持つ専用クラスを作るやり方をコレクションオブジェクトあるいはファーストクラスコレクションと呼ぶ。コレクションを操作するロジックをコレクションオブジェクトに閉じ込めると、コレクションオブジェクトを使う側のコードが単純になる。

コレクションオブジェクトを安定させる

コレクション操作をコレクションオブジェクト外では出来ないようにすることによりコレクションオブジェクトを安定させることが出来る。コレクションの操作を安定させる方法は3つある。

  • コレクション操作のロジックをコレクションオブジェクトに移動する
  • コレクション操作の結果も同じ型のコレクションオブジェクトととして返す
  • コレクションを不変にして外部に返す。

良い例(コレクション操作の結果を同じ型のコレクションオブジェクトを作って返す)

class Customers {
  List<Customer> customers;
  ・・・
  Customers add(Customer customer) {
     List<Customer> result = new ArrayList<>(customers);
     result.add(customer);
     return new Customers(result); 

  }
}

良い例(コレクションへの参照は変更不可にして渡す)

class Customers {
  List<Customer> customers;
  ・・・
  List<Customer> asList(){
    return Collections.unmodifiableList(customers)
  }
}

操作対象のデータを持つクラスにロジックを集めることがオブジェクト指向設計の基本。データを持つクラスにロジックを集めると、使う側のクラスと使われる側のクラスのどちらのコードもわかりやすくなる。

システム設計の原則2

システム設計の原則の感想2

値の範囲を制限してプログラムをわかりやすく安全にする

基本データ型をそのまま使うと実際の業務とはかけ離れた値を設定出来てしまい、無意識に異常な値を扱ってしまう可能性がある。業務的に正しい値を扱うためには値の範囲を制限してプログラムをわかりやすく安全にする。そのようにすることによりバグを生む原因を防ぐことが出来る。

値を扱うための専用のクラスを作る

業務アプリケーションをオブジェクト指向で設計する場合には、業務で扱うデータの種類ごとに専用の型を容易する。そうすることで業務的に不適切な値が混入するバグを防ぐことが出来る。値を扱うための専用クラスを作るやり方をvalue objectと呼ぶ。value objectを作成することで業務の関心事とコード表現を一致することが可能となり、その結果業務アプリケーションの変更は楽で安全になる。

値オブジェクトは不変にする

ある値を持ったオブジェクト内部の変数を別の値に置き換えるべきでは無い。別の値が必要になったら別のオブジェクトを作成する。値ごとに別のオブジェクトを用意することで、一つひとつのオブジェクトの用途が限定されプログラムが安定する。

システム設計の原則1

積読していたシステム設計の原則を読んでいる。この本非常に良い。今までモヤモヤしていたことが凄くクリアになっていく。学んだことをまとめる。

目的ごとのローカル変数を使う

ダメコード

taxRate = 1.05

price = quantity * unitPrice

price = price * taxRate

良いコード

taxRate = 1.05

basePrice = quantity * unitPrice

itemPrice = price * taxRate

よくやりがちだけどpriceを使い回し過ぎて分かりづらくなっている。変数の使い回しは同じローカル変数を使っている範囲に変更が波及するので予想外の副作用の原因となる。このように1つの変数を使いまわして代入を繰り返す書き方を破壊的代入と呼ぶ。破壊的代入がなくなればプログラムを変更したときの副作用が減り、コードが安定する。

メソッドの抽出

段落に埋もれていたロジックとデータをメソッドに独立させること。コードの重複を防ぎ、メソッドの名前からコードの意図を理解しやすくなる。

異なるクラスの重複したコードをなくす

2つのクラスでコードの重複がある場合はお互いの処理を別クラスに切り出す。

狭い関心事に特化したクラスにする

特定の関心事に特化した小さなクラスが、コードの見通しを良くして変更しやすくなる。なお、業務で使われる用語に合わせて、その用語の関心事に対応するクラスをドメインオブジェクトと呼ぶ。業務の用語と直接対応するドメインオブジェクトを用意することが、業務アプリケーションの変更を容易にするオブジェクト指向らしい設計のアプローチである。

メソッドは短く、クラスは小さく

  • 名前は略語ではなく普通の単語を使う
  • 数行のコードを意味のある単位として段落に分ける
  • 目的別の変数を使う(1つの変数を使い回さない)
  • 意味のあるコードのまとまりをメソッドとして独立させる
  • 業務の関心事に対応したクラス(ドメインクラス)を作る

株で利益を上げるために大切なこと

以前と比べると株価がだいぶ戻ってきた。日本株はまだ-50万程だが、アメリカ株は+300万ほど利益が出てきた。

f:id:hatakazu93:20200421084851j:plain

非常に難しい相場なのだが利益を上げることが出来た理由を考えると、上がる可能性が高い株を購入したに尽きると思う。今回購入した株は殆どが成長株で普通に考えたらどの株も割高と言われる株である。特にzoomなんかはper1600倍と訳が分からない数字となっている。

f:id:hatakazu93:20200421085433j:plain

多くの人のブログや株に関する投稿を読んでいると、この株が割安だとか大きく値下がりしたから買いだなどとの内容をよく見かける。だた、実際このような株を買って大きな利益を上げたことは自分の経験では無い。大切なのは株を安く買うことではなく、利益を上げることである。自分も一時期勘違いしていたのだが株を安く買うこと=利益では無い。このことに気付くまでにすごく長い時間を費やしてしまった。

結局は買値よりも株価が高くなればいいだけの話ということに気付くと株で利益を上げることが簡単になる。割安株の呪縛にとらわれている人は是非とも目を覚まして欲しいと思う。

高配当株は難しいということについて

株価が下落していることもあり現在高配当株が人気である。

高配当株については以前フィリップ・モリスを購入したことがあるが、現在大きな含み損を抱えている状況である。自分の感想としては高配当株投資は成長株投資よりも難しい。理由は損切りのタイミングが分からないからだ。

最近見た動画だとチンギスハンさんの動画が高配当株投資の難しい面を紹介している。

www.youtube.com

何が正解か分からない高配当投資よりも自分は成長株投資の方が向いていると思った。配当金は魅力的ではあるが浮気すること無く成長株投資の道を極めていきたい。

コロナ相場で取るべきだった対応について

最近やっと株価が落ち着いてきたこともあり反省の意味を込めて今回の相場で取り組みべきだった点を整理したい。

反省したい点

  • 買うタイミングが早すぎた
  • 1回あたりの購入量が多すぎた
  • トレンドに逆らった売買をしていた
  • 本当に買うべきタイミングでビビって動けなかった

1月後半ぐらいから安くなった銘柄を買い始めていたが、2月〜3月が鬼の様に下げて本当に辛かった。損切りしまくり、ナンピンしまくりで何とか生き延びたが相場を舐めたら痛い目に合うということを実感した。

ただ、得ることも多く一番の収穫はトレンドに逆らった売買をしてはダメということだ。要は下落相場はその名の通り下落していく可能性の方が高いので、このような相場では稼ごうとはせずいかに資産を守ることに徹するべき。安くなると衝動的に株を買いたくなるが、その気持をいかにコントロールするかが大切だと感じる相場だった。

まだまだボラティリティの大きい相場が当分は続きそうですが生き残る投資を目指して頑張っていきたい。

win-vpsのwindows server2016を日本語するためにやったこと

macでマネックス証券のトレードステーションを使いと思いvpsサーバを契約することにした。色々検討した結果ロシアのwin-vpsが恐ろしく安いことが分かった。

win-vps

f:id:hatakazu93:20200222140442j:plain

一番安いメモリ6Gのプランが3$なので、1ドル110円と考えて1ヶ月あたり330円。なお、別途OSのライセンス費用を月々支払う必要があるのだがそれも5〜10$といった感じで多くても1500円あればwindowsサーバを借りることが出来る。

これが日本の会社だと以下の値段となる。

お名前.com f:id:hatakazu93:20200222141151j:plain

1Gのプランで1ヶ月2400円も掛かる。仮に8Gにすると1ヶ月14000円とwin-vpsの10倍ぐらいの値段となる。流石にこれぐらい値段に差が出るとロシアの会社とはいえwin-vpsを選択せざる得ない感じ。もちろん日本語は通じないので若干不安はあったが申し込むことにした。

自分が選んだプランはBRONZE VPSでOSはwidows server 2016を申し込む事にした。申し込みをすると30分後ぐらいにはリモートディスクトップで接続出来るような状態になる。なおインストールされるwindowsサーバは言語が英語となる。やっぱり日本語の方が慣れ親しんでいることもあり、日本語化を試みることにした。

日本語化についてググってみると以下の情報が引っかかった。

investment-manual.com

要は日本語のランゲージパックを導入すれば日本語化するということである。何だ簡単じゃんと思ったのだが、上記のブログはwindows sever2012の日本語化について記載されており、書かれている内容どおりに対応しても日本語化することが出来なかった。

色々と悩んだり調査した結果。win-vpsのwindows server2016を日本語化するためには以下の対応を行う必要があることが分かった。

  1. windows updateを立ち上げる
  2. Windows Modules Installer Workerを立ち上げる。

特に2をやらないとランゲージパックをダウンロードしようとしても0x80070422エラーが出てダウンロード出来ない。この原因を突き止めるのに1週間ぐらい掛かったので解決した時は本当に嬉しかった。

上記対応を行いランゲージパックをインストール後は日本語化のブログの通り対応を行うとスムーズに日本語へと切り替えることが出来た。思ったよりもサクサク動作するのでmacでwindows関連のソフトを使いたい人はwin-vpsおすすめです。