9月1日(火)1、2コマ目

前回のテストを採点して

とりあえず、以下の3点を今後気を付けてください。

Itemクラスをサイズデータ受け渡しに使わない

プロパティが同じ(ID, 名前, 価格)なので、Itemクラスをサイズデータ受け渡しのために使っている方がおられました。

Itemクラスから連想するのは「商品かな?」です。おそらく、サイズではないと思います。

このような使いまわしは直感的ではないため、やめたほうがいいです。

掟1 クラス名や変数名から連想されるデータだけを扱うこと!


Index.cshtml.csのOnPost()にて①

選択された商品およびサイズを調べて、変数に代入するのですが、問題は変数名です。

Item target1 = null;

Size target2 = null;

のように、target1target2と変数名からなんなのかがわからない方が結構おられました。

たとえば、

Item targetItem = null;

Size targetSize = null;

なら、変数名から対象商品だな、選択されたサイズだなとわかります。

変数名にかかわらず、クラス名、メソッド名、プロパティ名は名前からわかるようにしてください。

掟2 名前から実態がわかる変数名やクラス名、メソッド名を命名すること!


Index.cshtml.csのOnPost()にて②

選択サイズによって価格の差額が決まります。

問題は商品の価格を計算、表示する部分です。


ご丁寧に

int price = targetItem.Price;

と変数を宣言したうえで、Tallでの金額を代入し、

price += targetSize.Price;

とサイズによる差額を反映して

strSelectedItem = "[" + targetItem.Id + "]" + targetItem.Name + ・・ + "(" + price + "円)";

で表示用文字列を作っている方がおられました。

変数priceは必要でしょうか?

以下で十分な気がします。

strSelectedItem = "[" + targetItem.Id + "]" + targetItem.Name + ・・ + "(" + (targetItem.Price + targetSize.Price) + "円)";

注意してほしいのは、計算の前後にカッコをつけることです。
プログラムは左から右へ実行されるため、文字列の結合が順に行われます。
計算式の前後にカッコがないと以下のように表示されてしまいます。
[1]ドリップコーヒー[short](330-50円)

SQLでもそうなんですが、必要なところにカッコがなかったり、不要なところにカッコがあったりします。動作順序を考えたうえで、先に実行させたい場合はカッコです。
掟3 さっと計算して終わるなら、わざわざ変数を使わない、計算してしまえ!

個人的な見解かもしれませんが

見やすいプログラムは不具合が少ないと思います。

見やすいプログラムは

  • 見た目がきれい
  • 読みやすい

がポイントだと思います。

見た目は開発環境を使えば、インデントやカッコの位置はちゃんとやってくれます。

しかしながら、なぜか1行ごとに空白行を入れて見づらくしている人がいます。これではVisualStudio開発チームの人たちが泣きます。いまどきの言い方だと、「マジ、意味わかんね」です。

空白行は処理のかたまりの分かれ目に入れるもんです。

読みやすいを実現する手段として

  • 変数やメソッド、クラスには名前から何かがわかるようにする
  • 簡単なロジック

がまずは第一歩だと思います。

今回の課題はめっちゃ簡単な課題ですが、残念ながら、動けばいい的なプログラム(ばっちいプログラム)を生産している方がおられます。そろそろ、気持ち悪いプログラムから抜け出すようにしてください。お願いします。

int、string以外もセッションオブジェクトに格納したい

HttpContextから取得したSessionはint、stringしか格納できません。(SetInt32()、SetString())

当然、取り出すことができるものもint、string(GetInt32()、GetString())です。

たとえば、List<?>のインスタンスを格納したくても、できません。

しかしながら格納したいオブジェクトをJSONに変換して格納する(結局、SetString()で格納する)方法があります。

ということで、ISessionに拡張メソッドを以下のように追加します。


この拡張メソッドはいままでのSetString()やGetString()と同じように使うことができる。

Llist<string>のインスタンスをセッションに格納

List<string> list = new List<string>();

list.Add("xxxx");

list.Add("xxxx");

list.Add("xxxx");

list.Add("xxxx");

HttpContext.Session.Set<List<string>>("list", list);


セッションからList<string>のインスタンスを取り出す

List<string> list = HttpContext.Session.Get<List<string>>("list");




注意!!

結局、セッションオブジェクトにはstringがセットされます。
セッションオブジェクトにセットしたモノをstringに変換するために、オブジェクトをJson形式にしています(シリアライズ化)。
よって、セッションオブジェクトに格納するたびにこのシリアライズ化を行う必要がある点に注意してください。

今日のサンプル

リストから選択した商品名をテーブル形式で表示するアプリケーションを作成します。

ポイントは

  • 選択商品名はList<string>に格納する
  • そのList<string>はセッションオブジェクトに格納してリクエスト間で共有
  • 今まではセッションオブジェクトにはint型、string型しか格納していない

です。

Startup.cs

セッションオブジェクトを使うための設定を行います。


SessionExtensions.cs

ISessionインタフェース(要はSessionオブジェクト)に拡張メソッドを追加します。


Index.cshtml

SessionExtensions.csで追加したGet<T>()メソッドを使い、セッションオブジェクト中の選択商品リスト(List<string>)を取り出し、表形式で表示しています。


Index.cshtml.cs

OnPost()メソッドにて、

  • セッションオブジェクトから選択商品名リスト取得(Get<T>()メソッド利用)
  • 取得した選択商品リストに引数の選択商品名を追加
  • セッションオブジェクトに選択商品名リストを追加(Set<T>()メソッド利用)

を行います。

セッションオブジェクトに格納された選択商品名リストはSet<T>()メソッドにて、JSON形式に変換(string型)され、SetString()メソッドでセッションオブジェクトに格納されます。

そのため、

  • Get<T>()で取得できるのはセッションオブジェクト中のList<string>のインスタンスへの参照情報ではない
  • よって、選択商品リストに追加後、またJSON形式に変換する必要があるため、Set<T>()を呼び出す必要がある

ことに注意してください。


やってみよう

選択肢が

  • iPad

に増えました。

また、表示される選択商品情報は

  • ID
  • iPadの種類

に増えました。


Startup.cs

サンプルと同じ。


SessionExtensions.cs

サンプルと同じ。


Item.cs

iPad情報をまとめて扱うためのクラス。


SelectedItem.cs

選択商品情報(ID、iPadの種類、色)をまとめて扱うためのクラス。


Index.cshtml

セッションオブジェクトから取り出すのはList<SelectedItem>。


Index.cshtml.cs

選択商品情報はSelectedItemクラスのインスタンスに格納。

さらにセッションオブジェクト中のList<SelectedItem>に追加する。


おまけ

<table>タグについて。
  • セルは<td></td>または<th></th>(見出し用セル)
  • 行は<tr></tr>
  • ヘッダ部は<thead></thead>
  • ボディ部は<tbody></tbody>
  • テーブルは<table></table>
図 HTMLの<table>タグについて


コメント

このブログの人気の投稿

7月21日(火)1、2コマ目

8月4日1、2コマ目