第8回まどべんよっかいち Kouji Matsui kekyo.wordpress.com)

Slides:



Advertisements
Similar presentations
G ゼミ 2010/5/14 渡辺健人. パフォーマンスの測定 CUDA Visual Profiler CUDA の SDK に標準でついているパフォーマン ス測定用のツール 使い方: exe ファイルのパスと作業ディレクトリ指定して実 行するだけ 注意点 : GPU のコード実行後にプログラム終了前に,
Advertisements

山元進.  今日 総合的な演習  来週  中間試験  期末と中間両方受けて初めて成績が付く  どちらかを欠席したら 成績表は X  期末試験:適切な理由があれば追試が受けられる  適切な理由であるかの判定のため、診断書などを持参せ よ  対外試合に参加、などの理由は基本的に認めない.
Final LINQ Extensions Center CLR Part.2 – Kouji
SQL による数独の解法 青山学院大学理工学部 矢吹太朗・佐久田博司. 数独とは何か ナンプレとも呼ばれ る制約充足問題 各行・列・ブロック に 1 から 9 の数字を一 つずつ当てはめる 新聞等に載っている ものはとても簡単 人間には難しいもの → もある.
Windows HPC Server を使ってみる
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
JPAを利用した RESTful Webサービスの開発
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第4回 配列(2) 情報・知能工学系 山本一公
ML 演習 第 8 回 2007/07/17 飯塚 大輔, 後藤 哲志, 前田 俊行
プログラミング言語としてのR 情報知能学科 白井 英俊.
Linqその効果的な使い方 えムナウ (児玉宏之)
Linqその効果的な使い方 えムナウ (児玉宏之)
データマイニングのための柔軟なデータ取得、操作を支援するAPIの設計
Lightweight Language Weekend ls-lRシェル
プログラミング基礎I(再) 山元進.
Linq for VB はものすごい えムナウ (児玉宏之)
Linq for VB はものすごい えムナウ (児玉宏之)
読んだもの1 P0145R1: Refining Expression Evaluation Order for Idiomatic C++
クイズ 「インターネットを使う前に」 ネチケット(情報モラル)について学ぼう.
C言語 配列 2016年 吉田研究室.
ソースコード品質概論 なぜソースの品質を追求するのか
オブジェクト指向プログラミング(2) OOPの三大要素 「クラス」「ポリモーフィズム」「継承」
情報科学1(G1) 2016年度.
プログラミング論 II 電卓,逆ポーランド記法電卓
情報工学科 二宮 洋・鈴木 誠 小林 学・高畠俊徳 火曜日 1コマ目
 データベースによる並列処理 情報論理工学研究室  三宅健太.
09 06/23 PHP と SQL (MySQL) の連携 その2
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
MPIによる行列積計算 情報論理工学研究室 渡邉伊織 情報論理工学研究室 渡邉伊織です。
2003年度 データベース論 安藤 友晴.
型付きアセンブリ言語を用いた安全なカーネル拡張
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
暗黙的に型付けされる構造体の Java言語への導入
プログラミング応用 printfと変数.
プログラミング入門 電卓を作ろう・パートIV!!.
アルゴリズムとデータ構造1 2006年6月16日
プログラミング 4 記憶の割り付け.
動的データ依存関係解析を用いた Javaプログラムスライス手法
オープンソース開発支援のための ソースコード及びメールの履歴対応表示システム
Null ヤバイのでなんとかする takeshik.
Null ヤバイのでなんとかする takeshik.
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
インタラクティブ・ゲーム制作 プログラミングコース 補足資料
アプリケーション依存の先読みが可能なO/Rマッピングツール
先週の復習: CPU が働く仕組み コンピュータの構造 pp 制御装置+演算装置+レジスタ 制御装置がなければ電卓と同様
3.リレーショナルデータベース,主キー, SQL
NGK2013B – 名古屋合同懇親会 2013忘年会 – Kouji
コーディングパターンの あいまい検索の提案と実装
アルゴリズムとプログラミング (Algorithms and Programming)
マイグレーションを支援する分散集合オブジェクト
統合開発環境によって表現された 言語機構によるコードのモジュール化
全体ミーティング (5/23) 村田雅之.
プログラミング入門 電卓を作ろう・パートI!!.
コレクション・フレームワーク J2EE I (データベース論) 第6回 /
コレクション・フレームワーク データベース論 第7回.
「マイグレーションを支援する分散集合オブジェクト」
アスペクト指向言語のための視点に応じた編集を可能にするツール
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
サブゼミ第7回 実装編① オブジェクト型とキャスト.
再帰CTE を使って遊ぼう 大阪#9 2012/04/14.
本当は消去できていない!? ~データを完全消去する方法~
本当は消去できていない!? ~データを完全消去する方法~
メソッドの同時更新履歴を用いたクラスの機能別分類法
ウェブデザイン演習 第6回.
第5回 プログラミングⅡ 第5回
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
VB6.0でグラフを書こう(とりあえず2次元)
第1章 文字の表示と計算 printfと演算子をやります.
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
Presentation transcript:

第8回まどべんよっかいち 2014.3.29 Kouji Matsui (@kekyo2 kekyo.wordpress.com) LINQ基本のキ 第8回まどべんよっかいち 2014.3.29 Kouji Matsui (@kekyo2 kekyo.wordpress.com)

や、やばい... 人、来るのか? (現在4名) 進捗、ダメ(2014.3.26現在)

気を取り直して、執筆しよう... 例えば、以下のような情報を引き出したいとします。 指定されたフォルダ配下の「*.dll」ファイルをロードして、その中にあるパ ブリックなクラスを抽出。 (リフレクションでやりますよ)

こんなコードか。

まぁ、難しくはない... じゃあ、これならどう? 指定されたフォルダ配下の「*.dll」ファイルをロードして、その中にあるパ ブリックなクラスで、プロテクトかつバーチャルなメソッドを一つ以上保持 するクラスを抽出。

見たような定型ロジックコード フラグ増えた フラグの有効範囲 フラグの組み合わせ ネストしまくるブロック ネストしまくるforeach

「全てはコントロール配下にあります。問題ありません」 更なる変更 指定されたフォルダ配下の「*.dll」ファイルをロードして、その中にあるパ ブリックなクラスで、プロテクトかつバーチャルなメソッドを一つ以上保持 するか、又はパブリックなプロパティが2つ以上存在し、かつ、それらのプ ロパティと同じ名称のプロパティ持つクラスが他に存在するクラスを抽出。

やめろぉ、クソコードぉ、ぶっとばすぞぉ 誰もが嫌がる クソコード ここに完成!!!

コレクション操作はLINQで書け!! 「SQL Serverでなら簡単にデータを抽出できるのに、C#やVB.NETで書くと めんどくさいんだよなぁ...」 とか、 「コレクションのデータは、すべからくforやforeach、while等で分岐しなが ら書くのが当たり前、いや、その方が判りやす いでしょ?」 IT技術者やり直してください (ちなみに本当にあった怖い話)

まだ納得が行かないのなら、物的証拠 こんなコードは、 テスト不能 大きいほどルートの組み合わせが多い。17って... 100に近いほど保守が容易。 1メソッド43はかなり悪い 大きいほどルートの組み合わせが多い。17って... Wikipedia: 「循環的複雑度(英: Cyclomatic complexity)とは、ソフトウェア測定法の一種である。プログラムのソースコードから、線形的に独立した経路の数を直接数える。」

LINQは集合演算を(.NETの世界で)一般化したもの SQL文を考えられる能力を持ちながら、DBから抜けてC#などの言語で 実装しようとした途端に、何故かロジックに落として実装しようとして しまう。 日頃からSQLの集合演算と同じことが、C#などの言語で書ければなぁ と感じつつ、いざ実装するとロジックで書いてしまう。 STOP!ロジック化 ロジック化は最後の手段だ

ロジックじゃない、集合の操作なんだ 例えば、以下のような情報を引き出したいとします。 classes *.dll publics やることが2つある。 ①複数個のdllをロードして、集合を作る ②その集合からパブリックなクラスを抽出する *.dll (assemblies) publics

集合のまま、処理するんだ。雑念は捨てよ。

もっと短く書ける リスト化するまでは、実際に抽出処理が行われていない。これをLINQの遅延実行という。

クエリの読みかたは 「上から下へ」 SQL文と微妙に違う(特にselect)ところに戸惑うアナタへ。 これらのクエリが代入される どの集合から抽出をはじめるのか 上から下へ順番に処理される。selectも例外ではない!!

そろそろ強力に見えてくる じゃあ、これならどう? 指定されたフォルダ配下の「*.dll」ファイルをロードして、その中にあるパ ブリックなクラスで、プロテクトかつバーチャルなメソッドを一つ以上保持 するクラスを抽出。 この集合演算だけ付け加えればよい

サブクエリだって書ける。実は単なる判定式 Any()は集合演算結果が1件以上存在するかどうかを返す。Count() >= 1 とする方法もあるが、Any()の方が効率が良い。

え? クエリが長くて読みずらいって? いや、.NETなんだから、どうとでも出来るでしょ?

リファクタリングしよう サブクエリが長くて読みにくいので、そこだけ別のメソッドとして分離 普通に呼び出すだけ

決して、LINQはデータベース 操作の「何か」ではありません。 いままでの話に、 データベースを扱う例は出ませんでしたね? (SQLの考え方みたいな話はしましたが) 一般的な、配列やコレクションの操作に、LINQが使えるって話です。 決して、LINQはデータベース 操作の「何か」ではありません。

でも、物の記事にはデータベースとの統合ががが 出来ますよ。ちゃぶ台を返しますが、 同じLINQ集合演算の記述で、データベー スに直接クエリを発行できます。 ?!?でも、さっきの例は配列やコレクションを操作してたよね?じゃあ、 データベースからレコードを取得したら、全部メモリに読み込まれてから しか抽出できないのでは?? 何百万件データがあったら使い物にならない じゃん?

LINQ誤解あるある その2 配列やコレクションの操作は「LINQ to Objects」と呼ばれるクラス群を使用し、データ ベースは「LINQ to Entities」と呼ばれるク ラス群を使います。 しかし、使い方は殆ど一緒(クエリの 書き方も一緒)なので、これらがごっちゃ に語られる事が多いのです。 しかも、これらのクエリ(Entities)を連結し、 データベースから抽出した複数のクエリの集合演 算を、メモリ上(Objects)で実行する事さえでき ます。

標準の集合演算子がいっぱいあるよ フィルタ Where 射影(別のクラスに入れ替えたりする) Select, SelectMany 自分でロジック書くのが馬鹿らしくなる 。 ちなみに、無ければ自分で作ることもできる! フィルタ Where 射影(別のクラスに入れ替えたりする) Select, SelectMany ソート OrderBy, OrderByDescending, ThenBy, ThenByDescending 結合 Join, GroupBy, GroupJoin, Concat, Union, Zip 集合演算 Intersect, Subtract, Exclude, Distinct 判定 Count, Any, All 切り出し First, FirstOrDefault, Last, LastOrDefault, Single, ElementAt, Take, Skip 固定化 ToList, ToDictionary 演算 Aggregate, Sum, Average, Max, Min その他、山ほどのアイテム。

速度は?と言ったら、お前はもう死んでいる まず、LINQで書く事。これにより、短時間で実装を完了させられる。 そして、問題となっているクエリを、測定するなどして確かめる。 その部分だけ、どうにかする。 従来式のロジックループに展開する(そこだけ)。 より高速な集合演算アルゴリズムに置き換える。 PLINQ(並列LINQ)を使う。「AsParallel()」をかますだけな ので、実装は容易。但し効果的に使うには、どこに適用すべきかの試行錯誤が必要。 まぁ、付けたり外したりするだけだから、リスクは殆どない。 ロジックで書いてたら、 こういう手法は端からムリ

Good LINQ! LINQの要は拡張メソッドネ。 某言語はマネ出来るのかしら? お勧めの本です。 通称、赤間本