佐々木屋

技術的なことから趣味まで色々書きます

5.演習・課題

電卓を作ろうの手引き⑬(まとめ)

オブジェクト指向による電卓アプリを作ってきましたが、このようにオブジェクト指向の機能を利用すると全体のコード量が多くなると勘違いするかもしれません。確かにデリゲートクラスを構築することは面倒なように見えますが、抽象クラス等による継承を利用…

電卓を作ろうの手引き⑫(継承を利用した方法②)

抽象的な何もしないクラスを定義しましたので、四則演算の各クラスに派生させていきます。 public class Calc_Plus : Calc_None { public override decimal? calc(decimal numRight) { try { return NumLeft + numRight; } catch (Exception ex) { ErrorMess…

三項演算子の有効活用

課題 例えば以下のような処理を考えます。 bool syoriFlg = true; string naiyo = ""; if (syoriFlg ) { naiyo = "hoge"; } else { naiyo = "piyo"; } Dim syoriFlg As Boolean = True Dim naiyo As String = "" If syoriFlg Then naiyo = "hoge" Else naiyo…

電卓を作ろうの手引き⑪(継承を利用した方法①)

デリゲートで演算メソッドを定義していた演算クラスたちを継承による方法に変更します。 まず、抽象的な何もしないクラスを定義します。繰り返しになりますが、今回はこのクラスもインスタンスとして使いますので抽象クラスにはしません。計算メソッドである…

電卓アプリを作ろう⑥(継承によるポリモーフィズムの実現)

デリゲートの利用によって一つのメソッドで実現できた演算管理メソッドですが、継承を利用したポリモーフィズムを実現することもできます。というか、多分こっちの方が分かりやすいかもしれません。 デリゲートはメソッドだけを宣言できますので、オブジェク…

電卓を作ろうの手引き⑩(演算管理クラス③の2)

デリゲート部分がまずかったことが分かり、以下のクラスを追加しています。 public class Ope_None { public decimal? calc(decimal numRight, ref string errorMessage) { return numRight; } } Public Class Ope_None Public Function calc(ByVal numRight…

電卓を作ろうの手引き⑨(修正の巻)

さて、前回フォームの構築でも説明した通り、この状態では電卓は機能しません。 悪い部分はズバリ以下のメソッドのデリゲートメソッド実行部分です。 public void Calculate() { if (ErrorFlg) return; try { string errorMessage = string.Empty; decimal r…

不要な制御フラグ

制御フラグでの条件分岐はよくある手法の一つですが、これが多くなりすぎると非常に可読性が悪くなります。 課題① 例えば以下のコードを見てみましょう。 int x = 1; int y = 2; bool flg = true; while (flg) { if (x * y > 10) flg = false; ++x; ++y; } D…

電卓を作ろうの手引き⑧(フォーム)

フォーム側は押下されたボタンの状態をクラスに渡すだけになりますので、一つ一つのイベントはあまり長くならないのが特徴です。 フォーム起動時イベント フォームが起動された時に発生する処理は、初期値を設定することと電卓の計算結果が0にならなければ…

電卓を作ろうの手引き⑦(演算管理クラス③の1)

最後に演算管理クラスの本丸である計算メソッドを構築します。 演算デリゲート 各演算クラスのCalcメソッド(戻り値decimal?、第一引数decimal、第二引数ref string)を実行するデリゲートとなります。戻り値はエラーと判別できるようにnull許容型にした方が…

電卓を作ろうの手引き⑥(演算管理クラス②)

前回に引き続き、演算管理クラスを作っていきます。今回は演算管理クラスの中で一番重要になるプロパティを作っていきます。 数値関係 表示用プロパティと入力数値(計算用)のプロパティを設定します。 表示用プロパティはsetterはクラス内部のみからしかア…

電卓を作ろうの手引き⑤(演算管理クラス①)

電卓アプリで最も重要な演算管理クラスを作ります。 sasaki816.hatenablog.com 既定値代入 クラスの既定値を代入するプロパティ処理を考えます。計算用(num)と表示用(ShowNum)に代入します。例えば、CEキー(表示だけを0にする)押下時などに利用できま…

電卓を作ろうの手引き④(共通関数)

数値変換 電卓には欠かせない数値変換関数です。これは電卓に限らず色々な場面で使えますので、一旦ちゃんと作っておくと役に立つと思います。 public static decimal NL(object value) { try { decimal res = decimal.Parse(value.ToString()); return res;…

電卓を作ろうの手引き③(演算クラスたち)

加減乗除のクラスを作っていきます。 VB6出身の方は多分ここで一回つまづくはずです。なぜなら、手続き型の場合はこの加減乗除をSelect Caseで分けて一つのメソッドにまとめていたと思います。例えば以下のような形です。 Dim intNum As Integer Select Case…

電卓を作ろうの手引き②(シンボリック定数)

定数をまとめて静的に宣言しておくと、アプリケーション設計上とても楽になります。変更時はこのクラスだけを変更すれば良いですし、拡張・縮小する場合も同様です。今回の電卓の場合は、桁数最大値と演算たちをそれぞれシンボリック定数として設定します。 …

電卓を作ろうの手引き①(エントリポイント)

ここからオブジェクト指向による電卓アプリ作成の解答例を紹介していきます。 なお、あくまでオブジェクト指向の練習として作成していますので、電卓アプリ自体の解答ではありません。また、「こうしたらもっと完結、且つ短く書けるよ!」というのもあるかも…

マジックナンバーはシンボリック定数に置き換える

課題 以下のコードのどこが問題でしょうか。 string[] colorNames = {"桃", "黒", "黄", "青", "赤" }; for (int i = 2; i <= colorNames.Length - 1; i++) { Console.WriteLine(colorNames[i]); } Dim colorNames As String() = {"桃", "黒", "黄", "青", "…

電卓アプリを作ろう⑤(各演算クラス)

各演算クラスを作ります。演算管理クラスでdelCalcデリゲートに保持する必要がありますので、以下の条件を満たさなければなりません。 ・引数はデリゲートするメソッドの引数(数、型両方)と同一でなければならない ・戻り値はデリゲートするメソッドの戻り…

電卓アプリを作ろう④(フォームクラス)

ボタン押下時の振る舞いを行うクラスです。 こんな感じで適当にコントロールをGUIで作ります。各ボタンとテキストボックスを用意します。なお、テキストボックスは桁数制限を設けますので、MaxLengthを20くらいにしておきましょう。簡単ですね。 ボタンは大…

電卓アプリを作ろう③(演算管理クラス)

早速クラスを作っていくわけですが、演算管理クラスがメインのクラスになるので、まずそこから構築していきます。関係性をおさらいしておきましょう。 今回は一番大きい演算管理クラスを作成します。 メンバー 以下が必要なメンバー構成です。なお、各メンバ…

電卓アプリを作ろう②(手続き型との構成の違い)

この課題はオブジェクト指向を学ぶためのものですが、実際にコーディングする前に手続き型とどのように違うのかを少し考えてみましょう。 手続き型(VB6など)の場合、以下の構成で作られていると思います。 これから作るオブジェクト指向の場合は、以下の構…

電卓アプリを作ろう①(構成)

電卓アプリをオブジェクト指向で作ってみましょう。電卓アプリの作成はプログラミングの初学者演習としてはよく出ますが、どちらかというとプログラミングのお作法(四則演算等)を学ぶもので、あまりクラス化とか継承とかを利用して作成するような例は見か…

リファクタリングの判断

私がコードをチェックする時、「これは駄目なコードだ」とリファクタリングの対象とする点がいくつかあります。 今回はそれをまとめて紹介しますので、共感できる部分は是非修正してみて下さい。逆に共感できない部分は、何故それが駄目なのかを考えるのも面…

オブジェクト指向型理解度チェック

VB6、VBAからC#、VB.NETへ流れてきた方専用のチェックリストを作ってみました。自分がオブジェクト指向型を理解しているかどうかを17個のチェックで確認することができます。①オブジェクトって何? ②クラスって何? ③インスタンスって何? ④クラスとインス…

手続き型とオブジェクト指向型の関係

VB6やVBAは手続き型と呼ばれていますが、別にオブジェクト指向で書けない訳ではないです。ただ「向いていない」のです。関係性としては、サッカーのフィールダーとキーパーみたいな感じですね。同じサッカー選手でボールを扱うのは一緒ですが、キーパーがド…