主体的・対話的で深い学びの視点に立った 授業の創造...平成29 年度の研究 「主体的・対話的で深い学び」の視点に立った授業の創造
20160910 可視性指定子と設計の話
Transcript of 20160910 可視性指定子と設計の話
可視性指定子と設計の話@r_ohki
1
2
public に簡単に write を書くのをやめよう !
目次• 本日の主張• 自己紹介• 発端• おさらい• 実際のコード• どこからはじめよう ?• その次
3
自己紹介• 氏名 : 大城 亮• @r_ohki• • ROki1988
• Windows のクライアントを開発してます• 最近、他の言語にも手を出してます
4
前回の勉強会にて…私「 property に write 書くの、すっごい慎重になりません… ? 」「……」「ふつうちゃう ? 」
ふつうちゃう !!
5
6
本日の目標
property に write を書くのを躊躇してもらう
可視性識別子のおさらい• 厳しいほうからゆるくなると• strict private• private• strict protected• protected• public
• class だけでなく record にもある
7
strict private• 一番厳しい• 同じクラスのインスタンスからのみ見える
UnitA.pas
TClassA = classstrict private Fid: string;end;
TClassB = classend;
UnitB.pas
TClassC = class(TClassA)end;
TClassD = classend;
8
UnitB.pas
TClassC = class(TClassA)end;
TClassD = classend;
private• まだ厳しい• 同じユニットからのみ見える
UnitA.pas
TClassA = classprivate Fid: string;end;
TClassB = classend;
9
UnitB.pas
TClassC = class(TClassA)end;
TClassD = classend;
strict protected• まだ厳しい• 継承関係にあるクラスから見える
UnitA.pas
TClassA = classstrict protected Fid: string;end;
TClassB = classend;
10
protected• だいぶゆるい• 同じユニットと継承関係にあるクラスから見える
UnitA.pas
TClassA = classprotected Fid: string;end;
TClassB = classend;
UnitB.pas
TClassC = class(TClassA)end;
TClassD = classend;
11
public• やわらか• 誰でも変更できる
UnitA.pas
TClassA = classpublic Fid: string;end;
TClassB = classend;
UnitB.pas
TClassC = class(TClassA)end;
TClassD = classend;
12
Q. public で何がいけない !!• A. 大事なデータが書き換えられていないことを人の手で担保しなきゃあいけなくなります
13
[ 復習 ]public• やわらか• 誰でも変更できる
UnitA.pas
TClassA = classpublic Fid: string;end;
TClassB = classend;
UnitB.pas
TClassC = class(TClassA)end;
TClassD = classend;
14
ID なんて大事なものを !• たとえば ) • 会員番号とか• 弊社であれば、ログの日付とか
• 何かあれば全チェック !?• この確認のためにいろんな処理を組むとか不毛すぎる…• ので、これを絞る !
15
[ 復習 ] strict private• Fid を変更できるのは、 TClassA だけ• なので、 TClassA の処理のみを追えばよくなる
UnitA.pas
TClassA = classstrict private Fid: string;end;
TClassB = classend;
UnitB.pas
TClassC = class(TClassA)end;
TClassD = classend;
16
public だけ取り出してみるtype TCollectedMetric = class public property CollectedDateTime: TDateTime read FCollectedDateTime; property CounterHandle: PDH_HCOUNTER read FCounterHandle; property Metric: TPdhFmtCounterValue read FMetric; end;
type TMetricsCollectorThread = class(TThread) public constructor Create(AIntervalMilSec: WORD; AIntervalEvent: TNotifyEvent); destructor Destroy; override; function TryAddCounter(const Element: PPdhCounterPathElements; out HCounter: PDH_HCOUNTER): Boolean; procedure RefilList<TTarget>(const ExportList: TList<TTarget>; AConvertFunc: TFunc<TCollectedMetric, TPdhFmtType, TTarget>);end;
type TTcpSendThread = class(TThread) public constructor Create(const CreateSuspended: Boolean; const HostAddr: string; HostPort, SendIntervalMSec, MaxStateCounter: Integer; const EncodeType: IdTextEncodingType); destructor Destroy; override;
procedure AddSendData(const Data: string); overload; procedure AddSendData(const Data: TList<string>); overload;end;
18
全然いじれない• むしろそれがいい• そのクラスが果たすべき役割が明確• たとえば、今収集スレッドクラスはきっと分かれる。きっと。1. 性能データの集め方を書いたクラス2. 定期的に集めてリストに蓄えるスレッドクラス
• テストコードで品質も向上• あんまり、書いてないですが…
19
オブジェクト指向• これまで話したこと = オブジェクト指向のカプセル化設計用語でいうと、誘導可能性• オブジェクト指向の要素には色々ありますが、まず 1 つ• データを更新する際に、一緒に更新する必要があるもの
=> 関数にして一緒に更新するようにする• コード読んだら分かる、を体現したもの• 冗長なコードを書いておいて、読んだら分かるは不親切
20
ですので• class helper の private 問題、僕は見れなくていい派です• private は private でしょう
21
どんないいことが ?• 責任が明確になる• モノの関係が見えてくる• 設計をどうすれば、ということを考えるようになる
22
まずは読んで使ってみる• Generics.Collections のクラス当たりがよかったです• TList.Contains() とかあったり• Create() の引数の違いとか
23
本とかも読んでみる•オブジェクト指向をきちんと使いたいあなたへ(Software Design 編集部 編 )• どういうメリットがあるのか、どう考えればいいのかの入りがあります
•リーダブルコード• 直接ではないですが…
24
書いてみる• strict private より始めてみました• 結構思ったよりかけます。無理じゃあない。
25
さらにその先• オブジェクト指向エクササイズ• ある 9 つのルールに沿ってコーディング
• ドメイン駆動設計• Eric Evans 氏が提唱• いろんな人が取り組んでいて、誰もが言うのが「まだ、道半ば」
26
まとめ• strict private ~ public の識別子の話をしました• クラス設計大事• 後の追跡性とか対応とかに影響します• 関係が明確になるので、 DB 設計のヒントにもなる
27