Open2
APIとプラグインの違い🤯

API
レストランの「注文システム」みたいなもの
お客さん(あなたのアプリ)がメニュー(API仕様書)を見て
↓
ウェイター(API)に注文を伝えると
↓
厨房(他のシステム)が料理を作って
↓
ウェイター(API)が料理を運んでくる
プラグイン
スマホの「アプリ」みたいなもの
本体(基本システム)に後から機能を追加する部品
本体の中に組み込まれて動く
例
- WordPressに翻訳機能を追加するプラグイン
- Chromeブラウザに広告ブロック機能を追加する拡張機能
具体例で説明
天気予報サイトの場合
API: 外部の天気データサービスから情報をもらう
プラグイン: サイト内に天気表示機能を追加
ECサイトの場合
API:外部の決済サービスと連携
プラグイン使用:サイト内にレビュー投稿機能を追加
表でまとめ
特徴 | プラグイン | API |
---|---|---|
役割 | アプリケーションの機能拡張 | ソフトウェア間の連携を可能にするインターフェース |
適用範囲 | 特定のアプリケーションに特化 | 複数のソフトウェアやサービスに適用可能 |
連携方法 | アプリケーションに直接組み込まれる | インターフェースを通じて連携する |
種類 | アプリケーションの種類によって多岐にわたる | WebAPI、OSのAPIなど |

プラグインの基本的な仕組み
- プラグインアーキテクチャ
本体システムが「プラグインを受け入れる仕組み」を持っています。
# 本体システムの例(簡単なイメージ)
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)()
- プラグインの実装例
# プラグインの例
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")
実際のプラグインシステムの例
- 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">';
}
?>
- 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);
}
プラグインシステムの核心的な仕組み
- フック(Hook)システム
- 本体が「ここでプラグインの処理を実行してね」という場所を用意
- プラグインがその場所に自分の処理を「引っ掛ける」
- イベント駆動
# イベント駆動の例
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", "晴れ")
- インターフェース(契約)
# プラグインが従うべき「契約」を定義
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: 外部から呼び出される独立したサービス
- プラグイン: 本体システムの内部で動く拡張機能
参考資料