SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

連載記事

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

CodeZine BOOKS(コードジン・ブックス)は、CodeZineの連載からカットアップした、開発現場の課題解決に役立つ書籍シリーズです。

書籍に関する記事を見る

'); googletag.cmd.push(function() { googletag.pubads().addEventListener('slotRenderEnded', function(e) { var ad_id = e.slot.getSlotElementId(); if (ad_id == 'div-gpt-ad-1659428980688-0') { var ad = $('#'+ad_id).find('iframe'); if ($(ad).width() == 728) { var ww = $(window).width(); ww = ww*0.90; var style = document.createElement("style"); document.head.appendChild( style ); var sheet = style.sheet; sheet.insertRule( "#div-gpt-ad-1659428980688-0 iframe {-moz-transform: scale("+ww/728+","+ww/728+");-moz-transform-origin: 0 0;-webkit-transform: scale("+ww/728+","+ww/728+");-webkit-transform-origin: 0 0;-o-transform: scale("+ww/728+","+ww/728+");-o-transform-origin: 0 0;-ms-transform: scale("+ww/728+","+ww/728+");-ms-transform-origin: 0 0;}", 0 ); sheet.insertRule( "#div-gpt-ad-1659428980688-0 div{ height:"+(90*ww/728)+"px;width:"+728+"px;}", 0 ); } else { if ($(window).width() < 340) { var ww = $(window).width(); ww = ww*0.875; var style = document.createElement("style"); document.head.appendChild( style ); var sheet = style.sheet; sheet.insertRule( "#div-gpt-ad-1659428980688-0 iframe {-moz-transform: scale("+ww/320+","+ww/320+");-moz-transform-origin: 0 0;-webkit-transform: scale("+ww/320+","+ww/320+");-webkit-transform-origin: 0 0;-o-transform: scale("+ww/320+","+ww/320+");-o-transform-origin: 0 0;-ms-transform: scale("+ww/320+","+ww/320+");-ms-transform-origin: 0 0;}", 0 ); sheet.insertRule( "#div-gpt-ad-1659428980688-0 div{ height:"+(180*ww/320)+"px;width:"+320+"px;}", 0 ); } } } }); }); } else { document.write('
'); document.write('
'); }
特集記事

Cで実現する「ぷちオブジェクト指向」

「抽象データ型」と「継承」を実現するコーディングスタイル


  • X ポスト
  • このエントリーをはてなブックマークに追加

オブジェクト指向言語全盛の今なお、Cは現役で活躍しています。手続き型言語であるCでオブジェクト指向のエッセンス、「抽象データ型」と「継承」を実現するコーディングスタイルを試みます。

  • X ポスト
  • このエントリーをはてなブックマークに追加

はじめに

 CodeZineではお初にお目にかかります、επιστημη(エピステーメー)です。最初のアーティクルはクラシックなCのお話。

 昨今のアプリケーションはオブジェクト指向言語による実装が主流と言ってもいいでしょう。C++、Java、VB.NETさらにはRubyやPythonといったスクリプト言語まで、オブジェクト指向でない言語を探すのに苦労するくらいです。

 本記事では、今なお現役バリバリで活躍している手続き型言語の代表格(?)Cによる、オブジェクト指向のマネゴト(オブジェクト指向風味のCコーディングスタイル)を試みます。

対象読者

 もっぱらCを主な開発言語として使ってはいるけども、オブジェクト指向に興味と憧れを抱いている方。

抽象データ型

 手始めにオブジェクト指向の特徴の1つ、「抽象データ型(ADT:Abstract Data Type)」をCで実現してみます。抽象データ型とは、データの具体的な詳細に一切触れず、そのデータに対して可能な操作の集合でデータを定義するものです。

 例えば簡単な例、「自動車の燃費シミュレーション」を考えてみましょう。車(Car)の内部にはガソリンタンクがあり、その容量(capacity)とガソリンタンクに蓄えられたガソリンの残量(remain)をデータとして持っています。車を走らすとおおむねその距離に応じてガソリンを消費しつつ、走行距離を伸ばしていきます。

 ここまでを構造体と関数で表現すると、次のようになります。

Car.h
#ifndef CAR_H__
#define CAR_H__

struct Car_type {
  int capacity_; /* タンク容量[L]   */
  int remain_;   /* ガソリン残量[L] */
  int mileage_;  /* 燃費[L/km]      */
  int distance_; /* 走行距離[km]    */
};

typedef Car_type* Car;

void car_initialize(Car car, int capacity, int mileage);
void car_drive(Car car, int distance);

#endif

 以下、関数car_initializeとcar_driveはそれぞれ「与えられたタンク容量と燃費で車を初期化する」「与えられた距離(km)走行する」を行います。

Car.c
#include "Car.h"

void car_initialize(Car car, int capacity, int mileage) {
  car->capacity_ = capacity;
  car->mileage_ = mileage;
  car->remain_ = 0; /* ガス欠状態 */
  car->distance_ = 0; /* メータ・クリア */
}

void car_drive(Car car, int distance) {
  /* ガソリン残量以上には走れない… */
  while ( car->mileage_ * distance > car->remain_ ) {
    --distance;
  }
  car->distance_ += distance;
  car->remain_ -= car->mileage_ * distance;
}

 これらをmain関数から呼び出してみます。

simulate.c
#include <stdio.h>
#include "Car.h"

int main() {
  Car_type c;
  car_initialize(&c, 50, 2);
  c.remain_ = 40; /* 給油 */
  car_drive(&c, 5); /* 軽くドライブ */
  car_drive(&c, 2); /* さらにも少し */
  printf("%d[km], remain: %d[L]\n", c.distance_, c.remain_);
  return 0;
}

 実にオーソドックスです。程度の差こそあれ、おそらく多くのCアプリケーションはこれと似たコードで実装されていることでしょう。

安全性に問題のある車

 ここでいくつかの問題(不安要素)があります。1つはCar_typeの利用者(ここでは「simulate.c」の作者)はCar_typeが持つメンバの型と名前を知らないことには走行距離やガソリン残量をプリントできません。

 メンバの型と名前を知るということは、すなわちそれらメンバを勝手に書き換えることができるということです。そのため例えばタンク容量を超えて給油したり、ヨソ様の車からガソリンを失敬したりすることができてしまいます。さらに、車の設計者(「Car.h」/「Car.c」の設計/実装者)がメンバの名前/型を変更するたびに利用者はコードの変更を余儀なくされます。車を修理に出すたびに操作法が変わってしまうわけです。

 利用者が必要なCar_typeに対するすべての操作、ここでは給油や走行距離の取得などを関数で提供すれば、利用者はCar_typeの詳細を知ることも触れることもなく、提供された関数を使ってシミュレーションが可能です。

 ところが、利用者には依然としてCar_typeの中身が丸見え(アクセス可能)ですから、用意された関数を呼ばずとも直接メンバを参照/変更できてしまいます。利用者つまり「Car.h」を#includeしたコードにCar_typeの中身を隠すことはできないものでしょうか?

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
Opaque-type(不透明な型)の導入

修正履歴

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

επιστημη(エピステーメー)

C++に首まで浸かったプログラマ。Microsoft MVP, Visual C++ (2004.01~2018.06) "だった"りわんくま同盟でたまにセッションスピーカやったり中国茶淹れてにわか茶...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/885 2007/02/14 10:06
" ); }

おすすめ

アクセスランキング

  1. 1
    ランサーズ、「2024年必要とされたスキルランキング」を公開。「Lancers」上のデータを集計 NEW
  2. 2
    「CentOS Stream 10」発表、Linuxカーネル 6.12 LTSを搭載 NEW
  3. 3
    いいエンジニアになるための2つのポイント ──元Google技術者・石原氏が説く「シリコンバレー流ソフトウェア開発術」
  4. 4
    AppleがSiriとChatGPTを統合、Apple Intelligence強化
  5. 5
    【超時短テクニカルライティング】生成AIを活用してドキュメントを書く流れを掴もう!
  1. 6
    2024年の提示年収が高いプログラミング言語は? paiza調査によるランキングが発表
  2. 7
    Google、XRデバイス用OS「Android XR」発表 NEW
  3. 8
    フロントエンドの定番ライブラリ「React」バージョン19の新機能を紹介──アクションによる非同期処理の進化 NEW
  4. 9
    「CUDA」 ~マンガでプログラミング用語解説
  5. 10
    デスクトップアプリを開発しよう! 「Rust」と「Tauri 2.0」の基本情報と環境整備の仕方を解説

アクセスランキング

  1. 1
    ランサーズ、「2024年必要とされたスキルランキング」を公開。「Lancers」上のデータを集計 NEW
  2. 2
    「CentOS Stream 10」発表、Linuxカーネル 6.12 LTSを搭載 NEW
  3. 3
    いいエンジニアになるための2つのポイント ──元Google技術者・石原氏が説く「シリコンバレー流ソフトウェア開発術」
  4. 4
    AppleがSiriとChatGPTを統合、Apple Intelligence強化
  5. 5
    【超時短テクニカルライティング】生成AIを活用してドキュメントを書く流れを掴もう!
  6. 6
    2024年の提示年収が高いプログラミング言語は? paiza調査によるランキングが発表
  7. 7
    Google、XRデバイス用OS「Android XR」発表 NEW
  8. 8
    フロントエンドの定番ライブラリ「React」バージョン19の新機能を紹介──アクションによる非同期処理の進化 NEW
  9. 9
    「CUDA」 ~マンガでプログラミング用語解説
  10. 10
    デスクトップアプリを開発しよう! 「Rust」と「Tauri 2.0」の基本情報と環境整備の仕方を解説
  1. 1
    いいエンジニアになるための2つのポイント ──元Google技術者・石原氏が説く「シリコンバレー流ソフトウェア開発術」
  2. 2
    「CUDA」 ~マンガでプログラミング用語解説
  3. 3
    ITエンジニア本大賞2025、投票締切直前! みんなで選んだ歴代の大賞本を振り返って一挙紹介
  4. 4
    デスクトップアプリを開発しよう! 「Rust」と「Tauri 2.0」の基本情報と環境整備の仕方を解説
  5. 5
    今後生成AIとどう向き合うべきなのか? 現場のエンジニアと研究者が最新研究事例から語り合う
  6. 6
    2024年12月に開催される注目のITエンジニア向けカンファレンス5選
  7. 7
    日本在住の英語を話すソフトウェア開発者、年収の中央値は950万円に
  8. 8
    Vue.js3.4~3.5の新機能をまとめて紹介! 新しいAPIやSSRの改善
  9. 9
    VSCodeをドキュメント作成に活用――テキストエディタ、Markdownエディタの設定と拡張機能を解説
  10. 10
    Python 3.13の新機能、対話型インタプリタの機能強化や高速化などを解説

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

メールバックナンバー

アクセスランキング

  1. 1
    ランサーズ、「2024年必要とされたスキルランキング」を公開。「Lancers」上のデータを集計 NEW
  2. 2
    「CentOS Stream 10」発表、Linuxカーネル 6.12 LTSを搭載 NEW
  3. 3
    いいエンジニアになるための2つのポイント ──元Google技術者・石原氏が説く「シリコンバレー流ソフトウェア開発術」
  4. 4
    AppleがSiriとChatGPTを統合、Apple Intelligence強化
  5. 5
    【超時短テクニカルライティング】生成AIを活用してドキュメントを書く流れを掴もう!
  1. 6
    2024年の提示年収が高いプログラミング言語は? paiza調査によるランキングが発表
  2. 7
    Google、XRデバイス用OS「Android XR」発表 NEW
  3. 8
    フロントエンドの定番ライブラリ「React」バージョン19の新機能を紹介──アクションによる非同期処理の進化 NEW
  4. 9
    「CUDA」 ~マンガでプログラミング用語解説
  5. 10
    デスクトップアプリを開発しよう! 「Rust」と「Tauri 2.0」の基本情報と環境整備の仕方を解説

アクセスランキング

  1. 1
    ランサーズ、「2024年必要とされたスキルランキング」を公開。「Lancers」上のデータを集計 NEW
  2. 2
    「CentOS Stream 10」発表、Linuxカーネル 6.12 LTSを搭載 NEW
  3. 3
    いいエンジニアになるための2つのポイント ──元Google技術者・石原氏が説く「シリコンバレー流ソフトウェア開発術」
  4. 4
    AppleがSiriとChatGPTを統合、Apple Intelligence強化
  5. 5
    【超時短テクニカルライティング】生成AIを活用してドキュメントを書く流れを掴もう!
  6. 6
    2024年の提示年収が高いプログラミング言語は? paiza調査によるランキングが発表
  7. 7
    Google、XRデバイス用OS「Android XR」発表 NEW
  8. 8
    フロントエンドの定番ライブラリ「React」バージョン19の新機能を紹介──アクションによる非同期処理の進化 NEW
  9. 9
    「CUDA」 ~マンガでプログラミング用語解説
  10. 10
    デスクトップアプリを開発しよう! 「Rust」と「Tauri 2.0」の基本情報と環境整備の仕方を解説
  1. 1
    いいエンジニアになるための2つのポイント ──元Google技術者・石原氏が説く「シリコンバレー流ソフトウェア開発術」
  2. 2
    「CUDA」 ~マンガでプログラミング用語解説
  3. 3
    ITエンジニア本大賞2025、投票締切直前! みんなで選んだ歴代の大賞本を振り返って一挙紹介
  4. 4
    デスクトップアプリを開発しよう! 「Rust」と「Tauri 2.0」の基本情報と環境整備の仕方を解説
  5. 5
    今後生成AIとどう向き合うべきなのか? 現場のエンジニアと研究者が最新研究事例から語り合う
  6. 6
    2024年12月に開催される注目のITエンジニア向けカンファレンス5選
  7. 7
    日本在住の英語を話すソフトウェア開発者、年収の中央値は950万円に
  8. 8
    Vue.js3.4~3.5の新機能をまとめて紹介! 新しいAPIやSSRの改善
  9. 9
    VSCodeをドキュメント作成に活用――テキストエディタ、Markdownエディタの設定と拡張機能を解説
  10. 10
    Python 3.13の新機能、対話型インタプリタの機能強化や高速化などを解説