タグ別アーカイブ: .net

Niigata.NET 2.1を開催しました #ngtnet

Niigata.NET 2.1 テックトーク+ハンズオン & .NET開発お悩み相談室 – connpass
https://ngtnet.connpass.com/event/41607/

先週11/19(土)に今年2回目となるNiigata.NET勉強会を開催しました。今回は従来のテックトークに加え、参加者の皆さんにも手を動かしてもらおうと、ハンズオン形式のセッションも取り入れてみました。

(当日の様子はこちら

 

プログラミング初級講座 C#編 – 分岐 by @AILight

最初のセッションは、新潟が誇るMS MVPの石野さんによる、シリーズもの第3弾です。if、switchといった「分岐」を扱う言語機能についてフォーカスし、初歩的な内容から紹介していただきました。

その中で印象的だったのは「分岐がないことが分岐の良い条件である」といったような雰囲気の言葉でした。

ともすると、分岐というものはいわゆるスパゲティコードになってしまいがちなものです。特に初心者、初級者のうちは、いわゆる設計書に書かれたロジックをそのまま表現しようとして、様々な条件が入り組み、深くなったif分を書いてしまうものです。

こういったif文、switch文を「いかに減らすか」が、分岐を扱うキモだと石野さんは主張されました。

その為に、if文をどうやって減らすかということを、コード例を用いて説明しました。その方法は主に以下の通り。

  1. 配列等を使ったジャンプ
  2. 「条件」でなく「データ」に着目

配列等を使ったジャンプ

引数が0->5のような値だとして、それに対応する値を返すような場合、それは引数をインデックスとみなして配列を用いて目的の値を返すようにすることで、if文をなくすことができます。

変更前
int SomeMethod(int value)
{
  if (value == 0)
  {
    return 5;
  }
  else if(value == 1)
  {
    return 10;
  }
  else if (value == 2)
  {
    ...
  }
  ...
}
変更後
if SomeMethod(int value)
{
  return new [] { 5, 10, ... }[value];
}

何かしらの値のテーブルを使って対応する値を返すようなケースでは、案外使えるケースはありそうです。

「条件」でなく「データ」に着目

小規模なアプリでメニューを作る際、ユーザーの情報を条件にif文を連ねて必要なメニューを表示するようにすると、条件の追加、変更に弱くなってしまいます。それを解決するため、「ユーザー情報」側にどのメニューを表示するかの判断を委譲し、メニューを構築する側ではそれを利用するだけにします。

変更前
if (user.IsHoge)
{
  // A機能メニューに追加
}
else if (user.IsFuga)
{
  if (user.IsPiyo)
  {
    // B機能メニューに追加
  }
  else
  {
    // C機能メニューに追加
  }
}
変更後
if (user.UseA)
{
  // A機能メニューに追加
}
else if (user.UseB)
{
  // B機能メニューに追加
}
else if (user.UseC)
{
  // C機能メニューに追加
}

このように「データ」を主体に構築することで、条件の追加、変更に強くなります。

 

先日リリースされたC# 7では「型スイッチ」機能などでさらに分岐のパターンが増えます。こういったものを使うにも、基本的なif、switchは押えておいた方がよいでしょう。

 

ASP.NET MVC開発体験 by @masaru_b_cl

私のセッションです。asp.net/mvcからアクセスできるASP.NET 5のチュートリアルを、会場の皆さんとやりながら簡単にASP.NET MVCの説明を行いました。

一緒に進めていくので、それぞれ進み具合が違い、ある程度余裕を持って進めていたので、MVCのCとVまでしかできませんでした。それでも、Cでリクエストを受け取って処理して返す、VはRazorで書く、Vの編集と確認はリビルド不要、くらいは説明できたので良しとしましょう。

実際、今回のセッションの裏テーマは「公式チュートリアルやろうぜ」でした。

大抵のメジャーなプラットフォーム、フレームワークは公式がチュートリアル用意してあることが多いです。もちろん英語なわけですが、「うわっ、英語怖い!」を乗り越えて読んでみると、実際は中学英語範囲の構文で読めますし、重要なのはコードなので万国共通のため、あんまり問題ありません。

それを避けてわざわざどこの馬の骨ともわからない人が書いた日本語blogエントリを読んだり、公式以外のチュートリアルを見ても、情報が古かったり、環境構築が大変だったりして、すんなりいかないことが、個人的には多いと感じています。

その点、公式チュートリアルは必要十分な情報をコンパクトにまとめてあることが多いです。一例として、某レールに乗るフレームワークのチュートリアルは、環境の違いかうまくできなかったんですよねぇ。でも、公式のやつは引っかかることもなくできたという経験があります。

ぜひ、未知のプラットフォーム、フレームワーク、ライブラリは、まずは公式チュートリアルから入ってみることをお勧めします。

あと、今回@circled9さんが前日にリリースされたばかりのVisual Studio for Macでぶっこんできて、「強い」と思いました。(ありがとう!)

 

.NET開発相談室

Niigata.NETの恒例コーナーにしていこうと目論んでおりますw

前回主催側がしゃべりすぎたため、今回は参加者の皆さんに多くしゃべってもらおうと思ったのですが、なかなかうまくネタを引き出せないものですね。それでも、なんとか四苦八苦してネタを絞り出し、あーだこーだ言える機会が持てたのは良かったです。

ただ、イベント終了後に「string型の変数の初期化をnullでやるのと空も時でやるの、どっちがいいんですかね?」みたいなことを聞かれ、「それをさっきの相談室で言ってもらえたら!」って思ったので、次回は「こんなのでいいんですよ」ってのを、もっと言ってかないとなぁと思った次第です。

 

そんな感じで、第3回の勉強会を終えました。今後はなんとか最低でも年2回ペースで開けるよう、いろいろと動いていきたいと思います。あと、主催側じゃないスピーカーの確保もぜひ。

 

なお、Niigata.NETでは「中の人」も募集しております!別にスピーカーをやれというわけではなく、イベント運営に必要な会場設営、受付、懇親会の手配など、色んな雑事の一部をお手伝いしていただけたらと思います。やってもいいよという方は、この記事へのコメント、Twitterでのメンション、ハッシュタグ#ngtnetを付けたつぶやきなど、何らかの手段でお知らせください。

広告

Niigata.NET 2.0を開催しました #ngtnet

Niigata.NET 2.0 | テックトーク&.NET開発お悩み相談室 – Niigata.NET | Doorkeeper

GWの終わりの5/7(土)にNiigata.NETの第2回勉強会を開催しました。

今回は前半は普段のテックトーク、後半は参加者の皆さんから普段の開発で困ったことなどについて、みんなで考えようなお悩み相談室としました。前回は初回ということで遠方よりご参加いただいたりと半ばお祭りでしたが、今回は地元参加者のみでの比較的少人数での会となりました。

テックトーク

考える、プログラミング初級講座 C#編 by @AILight

1つ目のテックトークは、越後が誇るMS MVPである@AILightさんによる、「変数」に絞ったC#入門でした(資料はアップされていないようです)。始めるまえに「時間が読めない」と公言していた通り、1時間半を超える大規模セッションになりましたf(^^;

ポイントを絞って振り返ってみます。

まず、C# ステップアップに大切なこととして次の3つを挙げています。

  1. 言語仕様を学ぶ
  2. ランタイムを学ぶ
  3. 短く書くようにする

C#の言語仕様については、最近はコードネームRoslynこと「.NET Compiler Platform」がオープンに開発が進んでいることもあり、ちょっと追うのが大変です。C# 5.0までくらいなら、VSのインストール先に入っているので、まずこちらで確認して、最新仕様は別途「C# によるプログラミング入門」などのサイトで確認するとよいと思います。

VS2015なら、言語仕様は以下のフォルダーにあります。

C:\Program Files\Microsoft Visual Studio 14.0\VC#\Specifications\1041\CSharp Language Specification.docx

次に変数の使い方として以下の3つを挙げています。

  1. 宣言
  2. 代入
  3. 参照

これらについて、実際の「自分のルール」含めて、変数名やvar使うか問題、多次元/ジャグ配列の宣言と初期化などについて語ってくれました。それらの中で、私も真似しようかなと思ったルールが一つあって、それは「変数名略すな」です。

よくこんなコードを書いてしまいがちです。


var client = new HttpClient();
client.~

ですが、ただの「client」ではもし今後HTTPSクライアントが増えたらどうするのか?といった視点から避けるべきという主張でした。その代わり、


var httpClient = new HttpClient();
client.~

のように、型名をcamelCaseにしたので良いのではということでした。

こんな感じで、「変数」だけでこれでもか、これでもかと大いに語ってくださいました。

テスト駆動開発(TDD) in .NET by @masaru_b_cl

私のセッションです。内容はスライドを参照ください。後日補足を加えて別途エントリにもまとめるつもりです。

私のセッションもデモ入れたりして少し長くなってしまいました。やはり資料をぎりぎりに作成するのはだめです……。

質疑応答は記憶している範囲ではこんな感じでした。

  • DB絡んだテストはどうするのか?
    • SetUp等でDB接続してデータをこしらえてテストしている
    • FastであることよりもIndependentでRepeatableな方が価値が高いので問題なし
  • いわゆる「単体テスト」に流用できないのか?
    • TDDのユニットテストは「開発者テスト」であり、品質保証を目的とするテストとは違うもの
      • 流用できる部分もあるかもしれないがそれほど多くない
    • 品証の単体テストは、単一コンポーネントというよりは各種コンポーネントを組み合わせて「ユースケース」を元に設計する
  • privateなメソッドのテストはやるのか?
    • privateなものはpublicなメソッドを通じて行う
      • privateなものは実装に近すぎて簡単にテストが壊れるため
    • そのためTDDもユースケースを考慮したテストを行う方がよい
    • もしprivateなメソッドをテストしたくなったら、単一責務の原則に従い責務分割のチャンス

 

.NET お悩み相談室

そして、今回のメインだったはずが、テックトークでだいぶ時間が押してしまい、30分くらいしかできませんでした。

出た話題としてはこんな感じだったかと。

  • 現在WinFormsのクラサバアプリを型付DataSet+TableAdapterを使って作っているが、EFにした方がよいのか?
    • MSのリソースはEFに集まっている
    • DataSetのように非接続型アクセスするには、ひと工夫必要
  • .NET関連の最新情報キャッチアップはみんなどうしているのか?
    • 最新情報を追っている人をSNS等でウォッチする
    • MSのドキュメント、チュートリアルを参考に手を動かす

時間がなかったので、正直消化不良気味でした。ぜひリベンジしたい。

 

全体を通じて

今回は参加者が地元の方だけということもあり、比較的おとなしい印象でした。また、TwitterをはじめとしたSNSのアカウントも持っていないような人が大半なのか、#ngtnetのTLは大変寂しいものになってしまいました。

今後に向けては、幹事の@AILightさん、@84taka0310さんとも相談していきますが、講師と生徒のような関係ではなく、もっと参加者の皆さんにガツガツ来てもらえるようなコミュニティにしていくため、何ができるか考えていかなくてはと思いました。地元の中小SIベンダーの一社員といった人に、どうやって動機づけしていくかは、地方コミュニティはどこでも同じ悩みを抱えているかもしれませんね。

 

次回について

少なくとも年2回の開催を目指すため、次回は10月あたりを予定しています。また日取り等決まったら告知します。