20160910 可視性指定子と設計の話

27
可可可可可可可可可可可 @r_ohki 1

Transcript of 20160910 可視性指定子と設計の話

Page 1: 20160910 可視性指定子と設計の話

可視性指定子と設計の話@r_ohki

1

Page 2: 20160910 可視性指定子と設計の話

2

public に簡単に write を書くのをやめよう !

Page 3: 20160910 可視性指定子と設計の話

目次• 本日の主張• 自己紹介• 発端• おさらい• 実際のコード• どこからはじめよう ?• その次

3

Page 4: 20160910 可視性指定子と設計の話

自己紹介• 氏名 : 大城 亮• @r_ohki• • ROki1988

• Windows のクライアントを開発してます• 最近、他の言語にも手を出してます

4

Page 5: 20160910 可視性指定子と設計の話

前回の勉強会にて…私「 property に write 書くの、すっごい慎重になりません… ? 」「……」「ふつうちゃう ? 」

ふつうちゃう !!

5

Page 6: 20160910 可視性指定子と設計の話

6

本日の目標

property に write を書くのを躊躇してもらう

Page 7: 20160910 可視性指定子と設計の話

可視性識別子のおさらい• 厳しいほうからゆるくなると• strict private• private• strict protected• protected• public

• class だけでなく record にもある

7

Page 8: 20160910 可視性指定子と設計の話

strict private• 一番厳しい• 同じクラスのインスタンスからのみ見える

UnitA.pas

TClassA = classstrict private Fid: string;end;

TClassB = classend;

UnitB.pas

TClassC = class(TClassA)end;

TClassD = classend;

8

Page 9: 20160910 可視性指定子と設計の話

UnitB.pas

TClassC = class(TClassA)end;

TClassD = classend;

private• まだ厳しい• 同じユニットからのみ見える

UnitA.pas

TClassA = classprivate Fid: string;end;

TClassB = classend;

9

Page 10: 20160910 可視性指定子と設計の話

UnitB.pas

TClassC = class(TClassA)end;

TClassD = classend;

strict protected• まだ厳しい• 継承関係にあるクラスから見える

UnitA.pas

TClassA = classstrict protected Fid: string;end;

TClassB = classend;

10

Page 11: 20160910 可視性指定子と設計の話

protected• だいぶゆるい• 同じユニットと継承関係にあるクラスから見える

UnitA.pas

TClassA = classprotected Fid: string;end;

TClassB = classend;

UnitB.pas

TClassC = class(TClassA)end;

TClassD = classend;

11

Page 12: 20160910 可視性指定子と設計の話

public• やわらか• 誰でも変更できる

UnitA.pas

TClassA = classpublic Fid: string;end;

TClassB = classend;

UnitB.pas

TClassC = class(TClassA)end;

TClassD = classend;

12

Page 13: 20160910 可視性指定子と設計の話

Q. public で何がいけない !!• A. 大事なデータが書き換えられていないことを人の手で担保しなきゃあいけなくなります

13

Page 14: 20160910 可視性指定子と設計の話

[ 復習 ]public• やわらか• 誰でも変更できる

UnitA.pas

TClassA = classpublic Fid: string;end;

TClassB = classend;

UnitB.pas

TClassC = class(TClassA)end;

TClassD = classend;

14

Page 15: 20160910 可視性指定子と設計の話

ID なんて大事なものを !• たとえば ) • 会員番号とか• 弊社であれば、ログの日付とか

• 何かあれば全チェック !?• この確認のためにいろんな処理を組むとか不毛すぎる…• ので、これを絞る !

15

Page 16: 20160910 可視性指定子と設計の話

[ 復習 ] strict private• Fid を変更できるのは、 TClassA だけ• なので、 TClassA の処理のみを追えばよくなる

UnitA.pas

TClassA = classstrict private Fid: string;end;

TClassB = classend;

UnitB.pas

TClassC = class(TClassA)end;

TClassD = classend;

16

Page 17: 20160910 可視性指定子と設計の話

17

実際のコードROki1988/PerfSrv

Page 18: 20160910 可視性指定子と設計の話

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

Page 19: 20160910 可視性指定子と設計の話

全然いじれない• むしろそれがいい• そのクラスが果たすべき役割が明確• たとえば、今収集スレッドクラスはきっと分かれる。きっと。1. 性能データの集め方を書いたクラス2. 定期的に集めてリストに蓄えるスレッドクラス

• テストコードで品質も向上• あんまり、書いてないですが…

19

Page 20: 20160910 可視性指定子と設計の話

オブジェクト指向• これまで話したこと = オブジェクト指向のカプセル化設計用語でいうと、誘導可能性• オブジェクト指向の要素には色々ありますが、まず 1 つ• データを更新する際に、一緒に更新する必要があるもの

=> 関数にして一緒に更新するようにする• コード読んだら分かる、を体現したもの• 冗長なコードを書いておいて、読んだら分かるは不親切

20

Page 21: 20160910 可視性指定子と設計の話

ですので• class helper の private 問題、僕は見れなくていい派です• private は private でしょう

21

Page 22: 20160910 可視性指定子と設計の話

どんないいことが ?• 責任が明確になる• モノの関係が見えてくる• 設計をどうすれば、ということを考えるようになる

22

Page 23: 20160910 可視性指定子と設計の話

まずは読んで使ってみる• Generics.Collections のクラス当たりがよかったです• TList.Contains() とかあったり• Create() の引数の違いとか

23

Page 24: 20160910 可視性指定子と設計の話

本とかも読んでみる•オブジェクト指向をきちんと使いたいあなたへ(Software Design 編集部 編 )• どういうメリットがあるのか、どう考えればいいのかの入りがあります

•リーダブルコード• 直接ではないですが…

24

Page 25: 20160910 可視性指定子と設計の話

書いてみる• strict private より始めてみました• 結構思ったよりかけます。無理じゃあない。

25

Page 26: 20160910 可視性指定子と設計の話

さらにその先• オブジェクト指向エクササイズ• ある 9 つのルールに沿ってコーディング

• ドメイン駆動設計• Eric Evans 氏が提唱• いろんな人が取り組んでいて、誰もが言うのが「まだ、道半ば」

26

Page 27: 20160910 可視性指定子と設計の話

まとめ• strict private ~ public の識別子の話をしました• クラス設計大事• 後の追跡性とか対応とかに影響します• 関係が明確になるので、 DB 設計のヒントにもなる

27