Null ヤバイのでなんとかする takeshik.

Slides:



Advertisements
Similar presentations
アルゴリズムとプログラミン グ (Algorithms and Programming) 第6回:クラスとインスタンス クラスの宣言 アクセス修飾子 インスタンスの生成 (new キーワード) this キーワード フィールドとメソッドの実際の定義と使い 方 クラスの宣言 アクセス修飾子 インスタンスの生成.
Advertisements

オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
独習JAVA Chapter 6 6.6 クラスの修飾子 6.7 変数の修飾子 結城 隆. 6.6 クラスの修飾 abstract インスタンス化できないクラス。1つまたは複数のサブクラスで 実装してはじめてインスタンス化できる。 final 継承されたくないことを明示する。これ以上機能拡張 / 変更でき.
Item 1:View C++ as a federation of languages. C++ はただの ”C のクラスがあるバージョン ” ではない → 例外安全 (29 項 ) 、テンプレート (41 項 ) 、オーバーロード等の導入によりデザインや目指すコードが 変化している プログラミング言語はあくまで言語.
本プレゼンテーション ( 以下、本書 ) で提供されている情報は、本書が 発表された時点における Microsoft の見解を述べたものです。市場 ニーズの変化に対応する必要があるため、本書は記載された内容の実 現に関する Microsoft の確約とはみなされないものとします。また本 書に記載された情報の正確さについて、保証するものではありません。
6.4継承とメソッド 6.5継承とコンストラクタ 11月28日 時田 陽一
アルゴリズムとデータ構造1 2005年7月8日
プログラミング基礎I(再) 山元進.
2008/03/01 D-BOF k.inaba はじめての initial D 2008/03/01 D-BOF k.inaba
Javaのための暗黙的に型定義される構造体
C# 3.0をはじめよう!!.
コンポーネントの再利用に必要な情報 えムナウ (児玉宏之)
コンポーネントの再利用に必要な情報 えムナウ (児玉宏之)
アルゴリズムとデータ構造1 2007年6月12日
プログラミング基礎I(再) 山元進.
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
アルゴリズムとデータ構造 2011年6月13日
Flyingware : バイトコード変換による 安全なエージェントの実行
ソフトウェア工学 知能情報学部 新田直也.
プログラミング論 ファイル入出力
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
暗黙的に型付けされる構造体の Java言語への導入
Windows PowerShell Cmdlet
アルゴリズムとプログラミング (Algorithms and Programming)
オブジェクト指向 プログラミング 第七回 知能情報学部 新田直也.
プログラミング論 ファイル入出力
Null ヤバイのでなんとかする takeshik.
C#言語ソースプログラムの原型 C言語 C#言語 Hello World! Hello Students! オマジナイ! 適当なクラス名
Java8について 2014/03/07.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
アルゴリズムとデータ構造1 2005年7月5日
インタラクティブ・ゲーム制作 プログラミングコース 補足資料
もっと詳しくArrayクラスについて調べるには → キーワード検索
アルゴリズムとデータ構造1 2005年6月24日
アルゴリズムとデータ構造 2010年6月21日
オブジェクト指向プログラミングと開発環境
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト・プログラミング 第8回.
TDD ってどんな感じ? FizzBuzz を作ってみる 2010/01/22 biac 1.
NGK2013B – 名古屋合同懇親会 2013忘年会 – Kouji
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
C#プログラミング実習 第3回.
アルゴリズムとデータ構造 2012年6月11日
Javaによる Webアプリケーション入門 第4回
System.AddInを利用したアプリケーション拡張 - アドインの開発 -
アルゴリズムとデータ構造1 2006年6月23日
アルゴリズムとデータ構造1 2009年6月15日
メンバとメソッド C言語の構造体 変数の集まり C#言語のクラス + それを処理する関数の集まり フィールド または メンバ変数 メンバ
JAVA入門⑥ クラスとインスタンス.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
cp-3. サブクラス,継承 (C++ オブジェクト指向プログラミング入門)
cp-2. 属性,アクセサ (C++ オブジェクト指向プログラミング入門)
cp-1. クラスとメソッド (C++ オブジェクト指向プログラミング入門)
How To WPF アプリケーション Part4 By 中博俊.
アルゴリズムとデータ構造 2010年6月17日
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
演算子のオーバーロード.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第十回 知能情報学部 新田直也.
System.AddInを利用したアプリケーション拡張 - アドインの開発 -
デフォルト引数 長谷川啓.
Presentation transcript:

null ヤバイのでなんとかする takeshik

事故紹介 廃ついったったー ジロリアン Twitter クライアント? MetaTweet 制作中 https://twitter.com/takeshik ジロリアン ホーム: 仙川 三田本店にはまだ行けてません Twitter クライアント? MetaTweet 制作中 http://www.metatweet.org/ 未だに未完成 永遠に開発中 おまけで Tween に手を出してみたり

流れとか 対象環境: .NET 使用言語: C# 3.0 null の何たるかについて軽く解説 ↓ null のいやらしさについて嘆く ↓ 時間が余ったら二郎の素晴らしさを熱く語る

で、null ってなんぞ? どのオブジェクトも参照していないことを 示す特別な値 (Visual Basic では Nothing) メンバにアクセスしようとすると例外 NullReferenceException を投げる 値型 (struct, enum) には代入できない 小難しい話は全部割愛 (←重要)

null の周辺要素 Nullable<T> 型 (T?) null 結合演算子 (??) default キーワード a ?? b  =  a != null ? a : b default キーワード 参照型の場合 null、値型の場合デフォルト値 Generics 向け機能 default(int?) == null

null の恐怖 …できれば見なかったことにしたい! ちょっとのことで例外が飛ぶ チェックとか面倒 プロパティとかにアクセスするだけでアウト チェックとか面倒 if (a == null) とか苦痛 面倒なのに結構 null を返すメソッドが多い 「無」を表すのにもっと適切な値が存在する 場合がある (ex. Stream.Null) …できれば見なかったことにしたい!

null への対処方法 (1) 真面目に条件分岐 null 結合演算子の利用 if (a == null) ...; 単体だとそうでもないがちょっと面倒 null 結合演算子の利用 a = a ?? new T(...); 初期化みたいな用途とかだと使えるかも 使い所が広く存在するか微妙

null への対処方法 (2) ちょっとしたメソッドを作る FileInfo file = ...; TResult GetOrNull<TSource, TResult>( TSource obj, Func<TSource, TResult> func) { return obj != default(TSource) ? default(TResult) : func(obj); } FileInfo file = ...; GetOrNull(file, f => f.FullName); file が非 null ならファイルのフルパスが取得できる file が null ならそのまま null が返る → チェック省けて幸せ!

null への対処方法 (3) 静的メソッドは何かと面倒 拡張メソッドはただの構文糖どころじゃない さっきのメソッドも だったら拡張メソッドにすればいいじゃないか 拡張メソッドはただの構文糖どころじゃない 内部的には静的メソッドなので this 値が null に なり得る! → null でも呼べるメソッド さっきのメソッドも TResult GetOrNull<TSource, TResult>( this TSource obj, Func<TSource, TResult> func) file.GetOrNull(f => f.FullName); 行儀が悪いのでご利用は計画的に

null への対処方法 (4) Nullable<T> があるなら逆があってもいいよね! public struct NonNull<T> where T : class { // operator ==, operator != は省略 private readonly T _value; public NonNull(T obj) : this() { if (obj == null) throw new ArgumentNullException("obj"); this._value = obj; } public static implicit operator NonNull<T>(T obj) { return new NonNull<T>(obj); } public static implicit operator T(NonNull<T> obj) { return obj._value; } }

null への対処方法 (5) 実際に使ってみる NonNull<string> str = "test"; str = null; // ArgumentNullException 代入時に null を検知可能 Stream.Null のような「無」を表すオブジェクトを もっと積極的に使うようにしてみる ※ String.Empty のように null と比較するのが   相応しくないような事例もあるので時と場合によるかも とりあえず作ってみる

null への対処方法 (6) public struct Default<T> where T : class { // NonNull<T> と同じメンバ、 operator ==, operator != は省略 public Default(T obj) : this() { if (obj == null) this._value = GetDefault() else this._value = obj; if (this._value == null) throw new ArgumentNullException("obj"); } private static T GetDefault() { var member = typeof (T).GetMembers(BindingFlags.Public | BindingFlags.Static) .Where(m => m.Name == "Default" || m.Name == "Empty" || m.Name == "Null") .SingleOrDefault(); if (member is FieldInfo) return (T) (((FieldInfo) member).GetValue(null)); if (member is PropertyInfo) return (T) (((PropertyInfo) member).GetValue(null, null)); return null; } }

null への対処方法 (7) 使ってみる null 値の代入がうまく回避されている。 色々作ってみましたが結構便利…かもしれない? Default<string> s = null; Console.WriteLine(s == ""); Default<StreamReader> r = null; // true Console.WriteLine((r == StreamReader.Null)); // true null 値の代入がうまく回避されている。 色々作ってみましたが結構便利…かもしれない? 行儀が本当に良くないのでご利用は計画的に

まとめ いろいろ作ってみるのは結構楽しいです null をうまくやり込めて楽しいプログラミング 行儀の悪いコードはほどほどにしましょう 実はきながら型構造考えてたけど 意外と使えるかも…? 二郎はラーメンではありません