Open2

APIとプラグインの違い🤯

ひでひで

API

レストランの「注文システム」みたいなもの

お客さん(あなたのアプリ)がメニュー(API仕様書)を見て

ウェイター(API)に注文を伝えると

厨房(他のシステム)が料理を作って

ウェイター(API)が料理を運んでくる

プラグイン

スマホの「アプリ」みたいなもの

本体(基本システム)に後から機能を追加する部品
本体の中に組み込まれて動く

  • WordPressに翻訳機能を追加するプラグイン
  • Chromeブラウザに広告ブロック機能を追加する拡張機能

具体例で説明

天気予報サイトの場合
API: 外部の天気データサービスから情報をもらう
プラグイン: サイト内に天気表示機能を追加

ECサイトの場合
API:外部の決済サービスと連携
プラグイン使用:サイト内にレビュー投稿機能を追加

表でまとめ

特徴 プラグイン API
役割 アプリケーションの機能拡張 ソフトウェア間の連携を可能にするインターフェース
適用範囲 特定のアプリケーションに特化 複数のソフトウェアやサービスに適用可能
連携方法 アプリケーションに直接組み込まれる インターフェースを通じて連携する
種類 アプリケーションの種類によって多岐にわたる WebAPI、OSのAPIなど
ひでひで

プラグインの基本的な仕組み

  1. プラグインアーキテクチャ
    本体システムが「プラグインを受け入れる仕組み」を持っています。
# 本体システムの例(簡単なイメージ)
class MainSystem:
    def __init__(self):
        self.plugins = []  # プラグインを格納する場所
    
    def load_plugin(self, plugin):
        """プラグインを読み込む"""
        self.plugins.append(plugin)
        plugin.initialize(self)  # プラグインに本体を渡す
    
    def execute_plugins(self, event_type):
        """特定のタイミングでプラグインを実行"""
        for plugin in self.plugins:
            if hasattr(plugin, event_type):
                getattr(plugin, event_type)()
  1. プラグインの実装例
# プラグインの例
class WeatherPlugin:
    def initialize(self, main_system):
        self.main_system = main_system
        print("天気プラグインが読み込まれました")
    
    def on_startup(self):
        """システム起動時に実行される"""
        print("今日の天気を取得中...")
    
    def get_weather(self):
        return "晴れ"

# 使い方
main = MainSystem()
weather_plugin = WeatherPlugin()
main.load_plugin(weather_plugin)
main.execute_plugins("on_startup")

実際のプラグインシステムの例

  1. WordPress(PHP)
// WordPressプラグインの基本構造
<?php
/*
Plugin Name: My Custom Plugin
Description: カスタム機能を追加
*/

// WordPressのフックに自分の処理を追加
add_action('wp_head', 'my_custom_function');

function my_custom_function() {
    echo '<meta name="custom" content="my plugin">';
}
?>
  1. VS Code拡張機能(JavaScript/TypeScript)
// package.json(拡張機能の設定)
{
    "name": "my-extension",
    "contributes": {
        "commands": [{
            "command": "extension.sayHello",
            "title": "Hello World"
        }]
    }
}

// extension.js(実際の処理)
function activate(context) {
    let disposable = vscode.commands.registerCommand(
        'extension.sayHello', 
        () => {
            vscode.window.showInformationMessage('Hello World!');
        }
    );
    
    context.subscriptions.push(disposable);
}

プラグインシステムの核心的な仕組み

  1. フック(Hook)システム
  • 本体が「ここでプラグインの処理を実行してね」という場所を用意
  • プラグインがその場所に自分の処理を「引っ掛ける」
  1. イベント駆動
# イベント駆動の例
class EventSystem:
    def __init__(self):
        self.listeners = {}
    
    def on(self, event_name, callback):
        """イベントリスナーを登録"""
        if event_name not in self.listeners:
            self.listeners[event_name] = []
        self.listeners[event_name].append(callback)
    
    def emit(self, event_name, data=None):
        """イベントを発火"""
        if event_name in self.listeners:
            for callback in self.listeners[event_name]:
                callback(data)

# プラグインの使用例
event_system = EventSystem()

def weather_handler(data):
    print(f"天気情報: {data}")

# プラグインがイベントに登録
event_system.on("weather_update", weather_handler)

# 本体がイベントを発火
event_system.emit("weather_update", "晴れ")
  1. インターフェース(契約)
# プラグインが従うべき「契約」を定義
from abc import ABC, abstractmethod

class Plugin(ABC):
    @abstractmethod
    def initialize(self):
        """初期化処理(必須)"""
        pass
    
    @abstractmethod
    def execute(self):
        """実行処理(必須)"""
        pass

# プラグインはこの契約に従って作る
class MyPlugin(Plugin):
    def initialize(self):
        print("プラグイン初期化")
    
    def execute(self):
        print("プラグイン実行")

APIとプラグインの作り方の違い

API(FastAPI例)

from fastapi import FastAPI

app = FastAPI()

@app.get("/weather")
def get_weather():
    return {"weather": "晴れ"}

# 外部から http://localhost:8000/weather でアクセス

プラグイン

# 本体システムの内部に組み込まれる
class WeatherPlugin:
    def __init__(self, main_app):
        self.main_app = main_app
        # 本体の機能を拡張
        main_app.add_feature("weather", self.get_weather)
    
    def get_weather(self):
        return "晴れ"

違いのまとめ

  • API: 外部から呼び出される独立したサービス
  • プラグイン: 本体システムの内部で動く拡張機能

参考資料
https://plusers.jp/blog/wordpress-create-plugin