サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
都知事選
www.s34.co.jp
Mockpp 導入ガイド Mockppとは… 単体テストのフレームワーク CppUnit による自動テストはモジュールの品質を高め、安全/確実なソフトウェアの構築に大きな効果をもたらします。しかしながら CppUnitがうまく適用できないシチュエーションにも少なからず直面します。 ナビゲータ(class Navigator)の実装を考えてみましょう。ユーザはナビゲータに適当な複数のキーワードを与えます。ナビゲータはあらかじめ用意されたDatabaseにそのキーワードを食わせると、その検索結果としてURLが得られるものとします。さらにWebブラウザを制御するクラス:Browserも提供され、これにURLを与えるとブラウザに引き渡してくれるとしましょう。 つまり、Navigatorはその機能の実現にDatabaseとBrowserを利用することになります。DatabaseおよびBrowserは
オブジェクト指向設計の基本 オブジェクト指向プログラミングの特徴 伝統的な手続き指向プログラミングでは、実行する一連のステップ、すなわちアルゴリズムを記述するものをプログラムと考えます。オブジェクト指向プログラミングでは、プログラムはオブジェクトの相互作用システムをして記述します。一時的に必要となる領域、すなわちテンポラリ・バッファはプログラムのいたるところで用いられます。C++を厳格な手続き型言語として使うこともできますが、オブジェクト指向のアプローチをとることでC++の長所を生かすことができます。 オブジェクト指向プログラミングは、キーとなる概念をいくつか持っています。 ■ 抽象化の概念 最も基本的な概念で、大規模なプログラムをより単純に記述できるようにします。 ■ カプセル化の概念 プログラムの変更とメンテナンスを簡単にします。 ■ クラス階層の概念 プログラムを簡単に拡張できるよう
コンテナの種類による計算量の相違 はじめに 「C++はCより遅い」と言われることがよくあります。これはある意味で正しいといえるでしょう。 Cではプログラマが明示的に行なっている、変数に対する初期化/代入/後始末が、C++では暗黙のうちに行われます。 これは、プログラマの負担を軽減してくれる、とても便利な機能には違いありませんが、裏を返せば、プログラマの意識しない(コードに現われない)初期化/代入/後始末が起こるということであり、変数すなわちオブジェクトの初期化/代入/後始末に要する処理時間が大きいほど、「C++はCより遅い」と感じるはずです。 プログラムの中で日常的に用いられる配列やリストなどのコンテナに対する要素の挿入/削除を行なうとき、いったいどれほどの頻度で初期化/代入/後始末が起こっているのか、実際に計測してみることにしましょう。 前準備 まず、計測器をこしらえておきます。これはコ
テンポラリ・バッファとしての std::vector の利用 悩ましきテンポラリ・バッファ 一時的に必要となる領域、すなわちテンポラリ・バッファはプログラムのいたるところで用いられます。 void f() { char buffer[256]; ... } 上の例では256[char]のbufferをautomatic領域に確保しています。 場合によってはこのような固定サイズではなく、可変長のテンポラリ・バッファを必要とします。可変長のテンポラリ・バッファが必要なとき、通常opeartor newによってヒープ領域から確保するでしょう。 void f() { char* buffer = new char[N]; // Nは変数 ... delete[] buffer; } 当然のことながら、operator newによってヒープから確保した領域は、利用後速やかにoperator dele
このState Mapはゲートの制御モデルを表現しています。ゲートは2つの状態Locked(閉じている)とUnlocked(開いている)をもち、2つのイベントCoinとPassを受け付けます。 Coinイベント 門番が入場料を受け取った Passイベント 誰かがゲートを通過した また、ゲートには4つのアクションが定義されています。 Unlock ゲートを開ける Lock ゲートを閉じる Alarm 警報を鳴らす ThankYou 余分なお金をもらったことに礼を言う このState Mapの読み方は以下のとおりです: ゲートがLocked状態のとき: Coinイベントが発生したら、Unlocked状態に遷移してUnlockアクションを起こす。 Passイベントが発生したら、閉じているゲートを無理矢理誰かが通過したことに対しAlarmアクションを起こす ゲートがUnlocked状態のとき: P
SMC(State Map Compiler) の拡張 はじめに C Magazine 1999/9 で、SMC(State Map Compiler)を紹介しました。 SMCに状態遷移表を記述したスクリプト(テキストファイル)を食わせると、状態遷移表に書かれた通りに動作するFSM(Finite State Machine:有限状態機械) クラスを生成してくれます。 僕はこのSMCがいたく気に入り、更なる機能拡張を試みました。 スクリプト拡張 まず、SMCに食わすスクリプトの文法を少しばかり拡張しました。 namespace/package指定 SMCが吐くFSMおよびFSMが参照するコンテキストをnamespaceで囲む機能を追加しました。 スクリプトのヘッダ部に、 namespace <FSM-名前空間> package <FSM-package> と書いておけば、FSMを指定したna
ダウンロードとインストール CUnitは http://sourceforge.net/projects/cunit/ からダウンロードできます。 2003.06時点での最新版は1.1-0です。 zipもしくはtar+gzipで圧縮されているので、 適当なディレクトリに展開してください。 以下の説明はWindows/Visual C++ v6.0 環境で、 CUnitのルート・ディレクトリを<CUNIT>と表記します。 ライブラリのビルド CUnitはツール/ユーティリティの類ではありません。 テスト対象およびテストコードと一緒にリンクして実行モジュールを生成する’ライブラリ’です。 CUnitは様々なOS/処理系に対応しており、 その使用に先だってライブラリをビルドしなければなりません。 Visual Studio IDE から プロジェクト:<CUNIT>\CUnit.dsw をオープ
C++の新しいキャスト 従来のキャストの問題点 異なる型への変換において、C/C++ではキャストが用いられます。 // intからlongへのキャスト int ival; int lval = (long)ival; ご存知のとおり、キャストは非常に危険です。 本来ならば型の不一致によるコンパイルエラーをねじ伏せるのですから。 キャストの使われ方(意味)は、大きく3種(型変換/型変更/const外し)に分類されます。 型変換 // int から double へ int ival; double dval = (double)ival; 型変更 // long から int* へ long lval; int* iptr = (int*)lval; const外し // const int* から int* へ const int* ciptr; int* iptr = (int*)cip
正規表現ライブラリ ‘Boost Regex++’ の使い方 ‘webを介したプログラムの実行’というアプリケーションの新しい形態が現れ、perl,pythonなどに代表されるスクリプト言語がよく利用されるようになりました。スクリプト言語の多くはテキストすなわち文字列を扱うのを得意としています。 一方C++は文字列を扱うのがあまり得意ではありません。 最近になってようやく文字列を表現するクラスstd::basic_string が標準ライブラリに組み入れられました。 これによって文字列操作を頻繁に行い、かつ移植性の高いアプリケーションの実装がとてもやりやすくなりました。 しかしながら標準の文字列を手に入れたC++でもperlなどのスクリプト言語にかなわないことの一つが’正規表現(regular expression)’です。 たとえばWebの自動巡回を行うアプリケーションを考えてみましょう
オブジェクト指向とはなにか 日常生活の中のオブジェクト 私たちの身の回りには、自分で直接できることと自分では直接できないこととがあります。朝おきて何気なく読む新聞も、新聞社という組織が作り、近くの販売所が毎日届けてくれます。私たちが新聞を読むときには、誰がどのようにして作っているかを知る必要はありません。 また、あなたがエレベータに乗るときも、あなたは自分のいる階でボタンを押せばいずれエレベータがやってくると期待しているのです。それは、世の中にあるエレベータという乗り物がおおむねその様な動きをしていることを知っているからです。 駅まで行き、電車に乗る場合でも同じです。電車は、どこかの鉄道会社が作ったダイヤに従って動いているのです。あなたが、どの電車はこのように動きなさい、と規定するわけではありません。 通りでタクシーを拾う場合もそうです。あるタクシーは客待ちをしており、また、あるタクシーは
STL samples :function :struct :class <algorithm> 適用 for_each 検索 find find_if find_end find_first_of adjacent_find search search_n mismatch lower_bound upper_bound equal_range binary_search 係数 count count_if 比較 equal lexicographical_compare 複写 copy copy_backward 交換 swap swap_ranges iter_swap 変換 transform 置換 replace replace_if replace_copy replace_copy_if 充填 fill fill_n generategenerate_n 削除 remove
Refactoring C-code ここに挙げるリファクタリングの例は、 「リファクタリング」 マーチン・ファウラー トッパン/ISBN4-89471-228-8 に列挙されたJavaによるサンプルの中から、Cにも摘要できるものを選んだものです。(カッコ内の数字は該当ページを示します) すべてを必ず摘要しなければならないというものではありません。 より簡潔に/単純になると考えられるとき、正しく運用してください。 関数の抽出 (110)
STL Samples : <algorithm> 適用 for_each - template<class InputIterator, class Function> Function for_each(InputIterator first, InputIterator last, Function f); [first,last)にあるすべてのiに対し、f(*i)を行います。f(*i)の戻り値は無視されます。 #include <iostream> #include <algorithm> #include <vector> #include "to_string.h" using namespace std; struct print { void operator()(const int& i) { cout << i << ','; } }; void printfun(co
永続オブジェクトとXML 書き込みメカニズム 読み込みメカニズム 永続オブジェクトとXML 近頃XMLがやたらとクローズアップされてきています。サーバ/サーバ間あるいはクライアント/サーバ間のインタフェースとしてXMLを用いることで様々な接続に対応できるってことで、e-commerceをはじめとしたITの基礎技術として脚光を浴びてきたということでしょう。(e-commerceについては僕には良くわからないし、そんなbigなシステムを構築するつもりはありません^^;) XMLで遊んでいると様々な使いみちを思い付きます。アプリケーションの設定情報なんかをXMLで書くとか、状態遷移表をXMLで表現するとか... XMLは階層構造を持ったデータを表現する汎用のデータ・フォーマットです。階層構造を持ったデータを表現できるのなら、オブジェクトをXMLで表現できるだろうと考えました。たとえば、class
CSVからXMLへ CSV、そしてXML CSV(Comma Separated Value)をご存知ですか? 2次元の表をテキストで表現したもので、表の1行をテキストの1行で、行の各列を’,’で区切った形式です。 大抵の表計算アプリケーションはこのCSV形式のテキストファイルを出力することができます。 以下のCSVはExcelが出力したものです。 sales.csv 品名,単価,数量 りんご,128,12 みかん,36,24 バナナ,98,4 いやはや、まったくもって単純明解。ですがこの形式は人が読むのにはいいかもしれませんけど、コンピュータ(アプリケーション)がこれを読むのはかなり困難です。 このテキストの第1行目が、引き続くデータの各列の意味を表していることをあらかじめ教えておかなければなりません。それにこの第1行目自体、Excelの利用者が入力したものであり、すべてのCSVに必須な
CppUnit 導入ガイド ダウンロードとインストール CppUnitは http://sourceforoge/projects/cppunit/ からダウンロードできます。2002.11時点での最新版は1.8.0(βは1.9.10)です。 zipもしくはtar+gzipで圧縮されているので、適当なディレクトリに展開してください。 以下の説明はWindows/Visual C++ v6.0 環境で、CppUnitのルート・ディレクトリを<CPPUNIT>と表記します。 ライブラリのビルド CppUnitはツール/ユーティリティの類ではありません。テスト対象およびテストコードと一緒にリンクして実行モジュールを生成する’ライブラリ’です。 CppUnitは様々なOS/処理系に対応しており、その使用に先だってライブラリをビルドしなければなりません。 Visual Studio IDE から プ
21世紀、新しい歴史の扉が開きました。 私達が子供の頃、アニメやSF雑誌に目を輝かせワクワクした未来の世界は今や現実の世界として実現し更に新たな未来に向けてのテクノロジーの進化は果てしなく続いています。人間は、あくなき探究心をもった生き物です。何事にも興味をもつことが夢を実現するための大きな原動力と言えます。テクノロジーの進化を支える上でコンピューティングシステム構築は必要不可欠のものとなり人間とコンピュータとの共有がますます発展していくことでしょう。 私達、S34は、少数精鋭のプロフェショナルなソフトウェア開発集団です。 パラダイムシフトが叫ばれる中、S34が作り出すソフトウェアテクノロジーは単なる技術志向の積み上げやテクニックではありません。問題解決における思考技術の確立と人間とのコミュニケーションを土台としたヒューマンテクノロジー・ソフトウェアです。 私達S34は、ひとりひと
C++ 寄稿記事 επιστημη 氏から寄稿していただいた、開発者の方々にお役に立つテクニカルドキュメントです。Articles、References、Miscelaneousに分かれて説明しています。初心者の方からプロの方まで役に立つ読み物と資料集です。是非、開発のお役にお立て下さい。 Articles: 読み物 References: 資料集 Miscelaneous: 番外編
抽象データ型と Java/C++ そして COM/CORBA 抽象データ型とは… 抽象データ型 継承 多態 をオブジェクト指向の三本柱などと称しています。その中でも抽象データ型(あるいはデータの抽象化)はオブジェクト指向の最も基本的で重要な概念ではないかと考えます。 "データを抽象化する"とは、データをそれに対して適用できる操作の集合で定義することです。 簡単な例として"カウンタ"を考えてみましょう。カウンタには3つの操作: +1する (increment) -1する (decrement) 現在値を取得する を提供させることにします。 さて、このカウンタをCで実現するとどうなるでしょうか… typedef struct { long value_; } Counter; Counter* counter_create(); void counter_incr(Counter*); voi
このページを最初にブックマークしてみませんか?
『株式会社エス・スリー・フォー』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く