Upgrade to Pro — share decks privately, control downloads, hide ads and more …

クラス設計の手順

 クラス設計の手順

<対象>
・プログラミングを始めて3年以上
・オブジェクト指向でプログラミングをしている
・クラス設計などを担当するようになったが、設計とはどうすればよいのかわからない
・なんだか設計が後一歩と感じる

クラス設計に関して、どういう設計がよいなどの論は多くあるが、どうやったら設計ができるのかという論はあまりないので作成しました。

Avatar for Goto Akiko

Goto Akiko

May 11, 2025
Tweet

More Decks by Goto Akiko

Other Decks in Programming

Transcript

  1. 4

  2. 6

  3. 9

  4. 10 コードはTypeScriptで書いていきます。 export class Employee { constructor( public id: number,

    public name: string, public callRecords: CallRecord[] = [] ) {} } export class Customer { constructor( public id: number, public name: string, public callRecords: CallRecord[] = [] ) {} } export class CallRecord { constructor( public id: number, public durationMinutes: number, public timestamp: Date, public direction: Direction, public status: CallStatus, public topic: string, // 通話内容 public resolved: boolean, public employee: Employee, public customer: Customer, public previousCallIntervalMinutes: number = 0 // 計算してセットす る ) { employee.callRecords.push(this); customer.callRecords.push(this); } } // enums.ts export enum Direction { INBOUND = "INBOUND", OUTBOUND = "OUTBOUND", } export enum CallStatus { COMPLETED = "COMPLETED", NO_ANSWER = "NO_ANSWER", } //エントリーポイント index.ts const emp = new Employee(1, "山田 太郎"); const cust = new Customer(1, "佐藤 花子"); // 1回目の通話(発信) const call1 = new CallRecord( 1, 10, new Date("2025-04-01T10:00:00"), Direction.OUTBOUND, CallStatus.COMPLETED, "パスワードリセット", true, emp, cust, 0 );
  5. 12

  6. 16 コールセン ターの人 顧客 電話する 記録 Employee CallRecord Customer 発田くん

    若手プログラマー の中田さん なんか足りな い気がする 足りない気がするという 意味はわからないけど、 どうして「電話する」の横 にはクラス名がないの? !!
  7. 17 コールセンター の人 顧客 電話する 記録 Employee CallRecord Customer 発田くん

    若手プログラマー の中田さん そっか!「電話する」を クラスにしたらいいん だ!! Call しっくりくるね。
  8. 19 コードはTypeScriptで書いていきます。 export class Employee { constructor( public id: number,

    public name: string, public calls: Call[] = [] ) {} } export class Customer { constructor( public id: number, public name: string, public calls: Call[] = [] ) {} } export class CallRecord { constructor( public id: number, public topic: string, public resolved: boolean, public previousCallIntervalMinutes: number ) {} } export enum Direction { INBOUND = "INBOUND", OUTBOUND = "OUTBOUND", } export enum CallStatus { COMPLETED = "COMPLETED", NO_ANSWER = "NO_ANSWER", } // 左のコードの続き export class Call { public record?: CallRecord; constructor( public id: number, public timestamp: Date, public durationMinutes: number, public direction: Direction, public status: CallStatus, public employee: Employee, public customer: Customer ) { this.employee.calls.push(this); this.customer.calls.push(this); } setRecord(record: CallRecord) { this.record = record; } } //エントリーポイント index.ts const emp = new Employee(1, "山田 太郎"); const cust = new Customer(1, "佐藤 花子"); const call = new Call( 1, new Date(), 15, Direction.OUTBOUND, CallStatus.COMPLETED, emp, cust ); const record = new CallRecord(1, "プリンターの紙詰まり", true, 120); call.setRecord(record);
  9. 25

  10. 26 コールセンター の人 顧客 電話する 記録 Employee CallRecord Customer Call

    この図で、「電話する」をクラスにすることでブレークスルーがありま した。 名詞のもの(ここでは「コールセンターの人」「顧客」「記録」に関して クラスにしようという発想は生まれやすいですが、「電話する」などの 動作をクラスにすることは発想として生まれづらいことが多いです。 しかし、動作をクラスにして扱うとうまくいくケースが時々あります。