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

ソフトウェア開発におけるインターフェイスという考え方 / PHPerKaigi 2025

ソフトウェア開発におけるインターフェイスという考え方 / PHPerKaigi 2025

Ken’ichiro Oyama

March 22, 2025
Tweet

More Decks by Ken’ichiro Oyama

Other Decks in Technology

Transcript

  1. • interface /ˈɪnɝˌfeɪs/ • 接点。境界⾯。界⾯。 ◦ 点とか⾯ • 結び付ける。繋ぎ合わせる。 •

    ITの分野からみてもあまり違和感がないように思える。 ⼀般的な意味でのインターフェイス インターフェイス 6
  2. "オブジェクト インターフェースでは、クラスが実装すべきメソッドやプロパティの 宣⾔だけを⾏うコードを作 成できます。ここでは具体的な実装は必要ありません。 インターフェイスには、ふたつの互いを補完する役割があります。 1. 同じインターフェイスを実装していることで、 開発者が交換可能な異なるクラスを作成できるようにします。 2. メソッドや関数が、インターフェイスを満たす引数を受け付け、

    操作できるようにします。" ref: https://www.php.net/manual/ja/language.oop5.interfaces.php • 事前にインターフェイスを定義し、それを満たすクラスを実装するという「制約」 を設けることによっ て、 ある種の秩序 を提供しているといえる Interface(オブジェクトインターフェイス) インターフェイス 9 PHPのインターフェイス
  3. "interface(インタフェース)型は、メソッドのシグニチャの集まりで定義します。 そのメソッドの集まりを実装した値を、interface型の変数へ持たせることができます。" ref: https://go-tour-jp.appspot.com/methods/9 • Goでは、型がインターフェイスで定義された全てのメソッドを実装していれば、その型は⾃動的にイン ターフェイスを実装したことになる。 ◦ 明⽰的な implements

    キーワードは不要。 ◦ ダックタイピング "If it walks like a duck and quacks like a duck, it must be a duck" • Goのインターフェイスは値を使⽤する側(インターフェイスを満たす実装を使⽤する側)が定義する。 ◦ "Go interfaces generally belong in the package that uses values of the interface type, not the package that implements those values." ◦ ref: https://go.dev/wiki/CodeReviewComments#interfaces interface型 インターフェイス 11 Goのインターフェイス
  4. • Graphical user interface • アイコン、メニュー、ボタンなどの視覚的要素を使 ⽤してユーザーインタラクションを可能にするイン ターフェース • (以下個⼈の感想)

    • Webにおいては「UI」と呼ばれるものと強く関連が あるインターフェイス ◦ UI ... ⼈間と機械の間のインタラクションポイ ントであり、視覚的、聴覚的、触覚的な要 素。 ◦ 使いやすさ、効率性、アクセシビリティ、お よび美観に影響を与えることで、ソフトウェ アの成功を左右すると⾔える。 インターフェイス 13 GUI
  5. • Command-line interface • ユーザが⽂字列(コマンド)を⼊⼒してプログラ ムに命令するインターフェイス • ref: Command-line interface

    tool design / PHPerKaigi 2024 ◦ https://speakerdeck.com/k1low/phperk aigi-2024 インターフェイス 14 CLI
  6. • 使⽤者に対して表出しているのがインターフェイ ス • USB Type-AもUSB Type-Cもユニバーサルな接続 規格であり電源供給の仕組みでもあることは同 じ。しかし、表裏(上下)がなくなったことによ る使⽤体験向上はとても⼤きい

    • UIはUXに繋がる -> IはXに繋がる • インターフェイスは使⽤者の体験に繋がると捉え て設計しなければならない • 「⾒てわかる。使ってわかる」 視覚的、触覚的 (聴覚的)肌触りを意識しないといけない 様々なインターフェイスからみえるインターフェイスの特性 19 インターフェイスは使⽤者の体験に繋がる
  7. • "Deleting fields can cause serious problems if not done

    properly." ◦ ref: https://protobuf.dev/programming-guides/ proto3/#deleting • Protocol Buffersはメッセージをバイナリ形式でシリ アライズするが、それにフィールド番号を使⽤して いる。 • 使わなくなったからといって安易にフィールド番号 を詰めると、メッセージを正しくデシリアライズで きなくなる。 • フィールド番号を使われないように確保するために reserved キーワードがある。 様々なインターフェイスからみえるインターフェイスの特性 23 Protocol Buffers 契約であるがゆえに安易に変更できない
  8. "インターフェイスの裏にある実装は、プログラムの他 の部分に⼀切影響や⽀障を及ぼすことなく変更できる ように隠しておく必要がある" Brian W.Kernighan, Rob Pike. 「プログラミング作法」 第4章 •

    表出しているということは使⽤者から使⽤できて しまう。 • 使⽤者が契約の⼀部と考えてしまう。 • ⼀度使われてしまうと、安易に変更できない。実 質的に契約となってしまう。 様々なインターフェイスからみえるインターフェイスの特性 24 「実装の詳細は隠蔽されるべき」とはどういうことか(1/2)
  9. • インターフェイスとして、ボタンが⽤意されてい るのであれば、使⽤者は押す必要がある。(使⽤ 者への作⽤) • ボタンとして⽤意されたことで、連打されてしま うかもしれない。(提供者への作⽤) ◦ 本当はレバーとして⽤意すべきものだった のかもしれない。

    • 両⽅の作⽤を考慮してインターフェイスを考える 必要がある 様々なインターフェイスからみえるインターフェイスの特性 27 インターフェイスにはインタラクション(相互作⽤)がある
  10. • 関数のシグネチャもAPI。提供者と使⽤者が存在する インターフェイス ◦ 引数だけでなく関数名もその機能の使いやす さに影響する。いわゆる 「名前重要」 。 ◦ 当然、返り値のデザインも重要(相互作

    ⽤)。 • 複数の関数をまとめたパッケージもインターフェイ ス ◦ 使⽤者体験のためにどのようなデザインにす るか。何を⾒せて何を⾒せないのか。 • 「機能を実現できれば良いわけではない」ことがわ かる 何をインターフェイスとみるか 32 API (NOT Web API)
  11. • 例えば関数のテストは、その関数のシグネチャで は表現できないインターフェイスの挙動の詳細を 表現する 側⾯がある ◦ 関数の挙動⾃体は表出しているもの(契 約)。 ◦ 関数の責務をテストで表現する。

    • E2Eテストもユニットテストも同じ。 ◦ インターフェイスの使⽤者がソフトウェア のユーザなのか、隣で⼀緒にソフトウェア を開発しているエンジニアなのかの違い。 何をインターフェイスとみるか 33 テストはインターフェイスの契約の特性を強固にするもの
  12. "しかしそれ以外にも重要なインターフェイスが存在する。 プログラムとそれを使う⼈間との間のインターフェイスだ" Brian W.Kernighan, Rob Pike. 「プログラミング作法」第4 章 • エラーメッセージやアラートもインターフェイス。

    • エラーメッセージに、内容、原因等を過不⾜なく⽰ すことで、ユーザに次のアクションを促す。 ◦ そのまま「次のアクション」をエラーメッ セージに含められるとさらに良い。 • エラーメッセージやアラートからソフトウェアの使 ⽤体験を向上させる。 何をインターフェイスとみるか 35 エラーメッセージ ref: https://speakerdeck.com/biwashi/runbook-to-minimize-operational-costs-using-automated-code-generation
  13. • DDL。データベーススキーマ。 ◦ スキーマはOpenAPI Spec、Protocol BuffersといったWeb APIだけではない。 • 「このようなテーブルと制約でデータストアとし て機能しますので使ってください」というRDBに

    ⽤意されたインターフェイスと考える。 • テーブル名やカラム名だけでなく、制約も駆使し てインターフェイスとしての意図=契約を表現す る。 • (⼤抵は)テーブル名/カラム名の全てが使⽤者 に公開されているからこそ慎重にデザインする必 要がある。 何をインターフェイスとみるか 37 データベーススキーマ
  14. • Everything looks like an interface.(全てがインターフェイスに⾒える) • 今回の内容(特に後半)は、普段はおそらく「インターフェイス」とは呼ばれていない。 • 「インターフェイスという考え⽅」は、みなさんも空気のように当たり前に⾃然と意識していることだと

    思っている。 ◦ 「インターフェイスのような特性が必要な箇所はソフトウェア開発のいたるところにある」というメ ンタルモデル ◦ ⼀⽅、もう少し強めに意識するだけで開発に新たな視点を得られるものだと思っている。 神々は細部に宿る。 まとめ 39
  15. 40 わたしたちは、"Empower every company to deploy any ideas (誰もがデプロイできる社会を創る)" というミッ

    ションのもと、誰しもがプロダクト開発の担い⼿になることができる社会の実現を⽬指しています。ミッション の実現に向けて、共に挑戦する仲間を募集しています。 https://careers.tailor.tech/ 共に働く仲間を募集しています