EnumとModuleという難関。インジケータに進む前に <株入門>

移動平均とかインジケータの実装について、
やっとサクサク進むかと思いきや、
なかなかどうして難所に差し掛かりました。

ハッキリ言いますがRubyはやさしい言語ではないです。
慣れた人の使い勝手最優先で、
便利な分、複雑だったり、
簡潔に書ける分、わかりにくかったり、
自由な分、同じ処理を様々な記述が可能だったり、
慣れるまでは、とても面倒くさい言語です。
 
キャッチコピーに騙されちゃいけない。
今日紹介する部分はよく分からないことがあっても普通です。

インジケータの実装に進む為、通るポイントは以下、
1.クラス継承
2.インクルード
3.Enumerable
4.例外処理

4の例外処理は例外的にあんまり難しくないです。
まあ順番に通ってみましょう。

1.クラス継承
クラスに親子関係があります。親から子に継承、親から子が派生する。
これは既出ですね。
TradeクラスはArrayを継承しました。こんときは拡張って言いましたね。
継承関係はクラス図の説明で、犬とヨークシャーテリアの例を出したように、 
抽象から具体的に、というパターンを表すことが多い。
今回も、Indicatorという抽象的なクラスを用意し、
移動平均とか具体的なインジケータはそこから派生させます。

こうしておくと、同じコードを何度も書かずに再利用できます。
派生先では自分に固有のところだけ書き換えます。
今回もそのパターンで、calculate_indicatorメソッドだけ各々派生先で実装します。
 
前回Tradeの例では、配列をそのまま上書きしてますが、
小クラス < 親クラス という記述で継承を表します。
具体的なインジケータの実装で出てきます。
 
 
2.インクルード
これは新しい概念で、かつRuby固有でオブジェクト指向で一般的でない。
最初にRubyのModluteとClassの違いですね。
 
オブジェクト指向の一般論でいうとオブジェクトは「データ+振る舞い」で定義される。
データはプロパティ、振る舞いはメソッドと普通呼ばれます。
プロパティはオブジェクト内部に格納され、メソッドを通じてしか外からデータは操作できない、
というのは、オブジェクト指向の本来の考え方です。

で、オブジェクトをClassとして定義する。幾つかのオブジェクト指向言語はそうです。
Rubyでは内部のデータがなく、
引数を処理する機能(メソッド)だけを提供するオブジェクトをModuleと呼び、
Classと分けています。
他の言語だと、conststticとか書いて処理しそう。
で、ClassはModuleを継承できます。それがinclude。
目的としては機能の再利用、クラスの継承と同じ。
違うのは、継承元のModuleの方に内部データが無いこと。
雑な説明ではありますが、内部データの有無で区別するという理解で問題ないです。
 
追記: 
機能提供という意味では、内部データの有無よりも、
他の言語でのインターフェイス的な意味合いと理解する方が適切みたいです。

3.Enumerable
Enumって列挙って意味ですね。
配列とか順番に処理する類のデータの集合体のこと。

Rubyでは基本eachというメソッドと構文でデータの繰り返し処理を行います。
で、eachだけは派生した先で個別に実装してくれと、
そうしておけば、Enumerableの便利な機能が使えるようになっている。

で、ここIndicatorクラスでは、
派生先で生成される配列(か何か)のeachをそのまま実行する。

何度も同じコードを書かなくていいように、
抽象的なIndicatorクラスで便利な機能と仕組みは用意した。
各インジケータ固有の処理だけ個別に書けばよい。
これで、その為の準備は整った。

Enumerable→Indicator→個別のインジケータクラス
という継承による機能の提供が理解できればよし。
Enumerable→Indicatorはと、
Indicator→個別のインジケータクラスで、
それぞれ継承で同じようなことやってます。
ただし、
モジュールとクラス、クラスとクラス、での継承であることが異なります。

4.例外処理
想定外の変数が渡ってきたら、エラーを発生させてます。ここでは。
エラーの発生とその処理を、例外投入と捕捉という構造で処理します。
今回はエラーの発生させて捕捉処理しないようです。
そうすると、プログラムはエラーで停止します。
特に処理してないから、例外処理の構造は今回は気にする必要ない。

やってることは、配列の要素取り出すときに、インデックス指定します。
array[1]とか、問題はRubyでは、
array[2..5]とかarray[-3]とか、指定出来ることです。
何か却って邪魔くさいと思いますが、Rubyってそういうもんらしいです。
そういう邪魔くさい指定されたらエラー出すようにしてます。
それと、要素の値がNilだったらこれもエラー出すようにしてます。

要は、
インジケータの演算処理するときに邪魔なことが起こらないようにという配慮です。
邪魔なことが発生したら、エラーでプログラム停止します。

質問コーナー、お問い合わせは、sanpome.net@gmail.com まで。

  
 

社会・経済ニュース ブログランキングへ

にほんブログ村 海外生活ブログへ
にほんブログ村

カテゴリー: 株式投資, 株式投資入門はじめました2016.05 タグ: , , パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


*