2006年01月21日

C言語の制御構造

continue ;

 単語の意味は「継続する」という意味ですが、C言語で使われるときはほんのすこしニュアンスが異なります。次の例をよ〜くみてください。^^;

int count = 100 ;

while( count > 0 )
{
if( ある条件が真 )
continue;    // continueに出会うとループの先頭(whileの位置)に戻ってしまう
else
printf("Hello World!!\n");

--count ;      // count の値を1減算する。
}

 どうです。解りますか? これは、ある条件が真のときには、continueを実行するのですが、そのときには"Hello world!!"の表示もされないしcountの値も減算されないまま、ループ(繰り返し構造)の先頭まで戻ってしまうのですね。

continue; は途中でループの先頭に制御を戻す役割を果たす。対象はwhile,do〜while,for

return ;

 return文は、制御を自分の所属する関数の呼び出し元に戻ります。このときになにか値を返すことも出来ます。返すことの出来る値は一つだけです。次の例を見て下さい。

int sample( void ) ; // プロトタイプ宣言
int ans ; // 結果を受ける変数

ans = sample() ; // 関数sample()を呼び出している。ansに値を受け取る

int sample( void )  // 呼び出される側の関数の実態
{
int count = 100 ;

while( count > 0 )
{
if( ある条件が真 )
return count ; // return( count ) ;でも可だが、この書き方はエラーになりやすい。
else
printf("Hello World!!\n");

--count ;      // count の値を1減算する。
}
}

 先ほどのcontinueの代わりにreturn文が書かれていますね。しかもこのreturnはcountの値も返しています。従って呼び出し側では、この値を受け取ることになります。

使わなくても良いgoto

 gotoを使って同じ関数中にあるラベルの行までジャンプ(制御を任す)することができます。正しくプログラムのシナリオ(アルゴリズム)を考えればまず使うことはないのです。安易に使うとレビューのときに先輩に小言を言われますよ〜。笑とりあえず例を挙げておきましょう。

void tfunc( void )
{


goto HELLO;


HELLO: printf("hello\n"); //ラベルは大文字で書く癖を付けましょう。
}

 とまあこんな具合です。ジャンプ先のラベルの後ろにはコロン':' を付けます。関数の中だけで有効というのがミソですね。他のエリアにジャンプしたい場合には、関数を使用して行うのが普通です。調べてみて下さい。
SEE ALSO setjump() 、longjump();
posted by シンビアン at 12:23| Comment(0) | TrackBack(0) | Symbian OS C++ 実践開発技法 | このブログの読者になる | 更新情報をチェックする

抽象クラス

抽象クラスは、インターフェイスと密接に関係しています。抽象クラスはインスタンス化できないクラスであり、多くの場合、部分的に実装されるか、またはまったく実装されません。抽象クラスとインターフェイスの主な違いの 1 つは、クラスが無制限の数のインターフェイスを実装できる一方で、1 つの抽象 (またはその他の種類の) クラスからしか継承できないことです。抽象クラスから派生したクラスも、インターフェイスを実装できます。抽象クラスは、いくつかのメソッドで一定レベルの機能を指定しながら、他のメソッドの実装はそのクラスの特定の実装が必要になるまで保留しておけるため、コンポーネントの作成時に便利です。また、派生クラスで追加の機能が必要になったときには、コードを変更せずに基本クラスに追加できるため、バージョン管理にも適しています。
posted by シンビアン at 12:16| Comment(0) | TrackBack(0) | Symbian OS C++ 実践開発技法 | このブログの読者になる | 更新情報をチェックする

具象クラス

実装を持たないクラス メンバは抽象メンバです。1 つ以上の抽象メンバを持つクラスは、それ自体が抽象クラスとなり、新しいインスタンスを作成できません。ランタイムに対応する言語の中には、抽象メンバを持たないクラスでも抽象クラスとしてマークできるものもあります。抽象クラスは、派生クラスが必要に応じて継承したりオーバーライドしたりできる基本的な一連の機能をカプセル化する必要がある場合に使用できます。抽象クラスでないクラスを具象クラスと呼びます。
posted by シンビアン at 12:14| Comment(0) | TrackBack(0) | Symbian OS C++ 実践開発技法 | このブログの読者になる | 更新情報をチェックする

配列へのポインタと配列へのリファレンス

C/C++ のあまり使われない機能に、配列へのポインタと配列へのリファレンスがあります。ここでは、それらがどのようなものかまとめたいと思います。

配列へのポインタ

C 言語には配列の先頭要素へのポインタとは別に配列へのポインタ が存在します。。プログラミング言語Cの 5.7 に多次元配列を受け取る関数の例が載っています。

次のプログラムではサイズ 256 の char 型の配列を作り、その配列へのポインタ p を作っています。++p を実行すると p の指すアドレスは 256 バイト分進みます。

#include
int main() {
char foo[256];
char (*p)[sizeof(foo)] = &foo;
printf("%p\n", p);
++p;
printf("%p\n", p); // 256 バイト分進む
return 0;
}

配列へのリファレンス

C++ には配列へのリファレンスがあります。通常、配列のデータを関数に渡すときはポインタと長さで渡したり、末尾に番兵を添えてポインタで渡したりしますが、C++ では配列へのリファレンスを使う方法もあります。

#include
int main() {
char foo[] = "abcdef";
char (&ref)[sizeof(foo)] = foo;
ref[0] = 'A';
printf("%s\n", foo); // "Abcdef" が表示される
printf("%d\n", sizeof(ref)); // これは 7
return 0;
}

どちらの機能も使う機会はそれほどなさそうですが、覚えておくといざというときに役立つかもしれません。これは万能の言い訳、「覚えておくといざというときに役立つかもしれない、という口実で雑多な知識を吸収してしまう」の法則という気もします
posted by シンビアン at 12:02| Comment(0) | TrackBack(0) | Symbian OS C++ 実践開発技法 | このブログの読者になる | 更新情報をチェックする

Effective C++ 改訂2版

「ポインタへのポインタ」は「ポインタへのリファレンス」にした方が C++ 的。C は何でもマクロ、ポインタ、構造体、配列、関数で解決する言語ということもできる。
posted by シンビアン at 11:58| Comment(0) | TrackBack(0) | Symbian OS C++ 実践開発技法 | このブログの読者になる | 更新情報をチェックする

ミックスイン

親クラスによってパラメーター化されたクラス
posted by シンビアン at 11:02| Comment(0) | TrackBack(0) | Symbian OS C++ 実践開発技法 | このブログの読者になる | 更新情報をチェックする

多重継承

より複雑な継承
継承は一段階にとどまりません
ある基本クラスから派生したクラスを基本クラスとして
さらにそこから派生クラスを生成するといった多段階継承が可能です

串のように、断層的に継承した場合、コンストラクタはもっとも最下層の基本クラスから実行され
デストラクタはその逆、最終的な派生クラスのものから実行されます
このとき、派生クラスの基本クラスが継承している基本クラスを間接基本クラスと呼びます

間接基本クラス
|
基本クラス
|
派生クラス

上の図は派生クラスから見た関係図です
派生クラスは上の二つのクラスの機能を全て継承しています

#include
using namespace std;

class Neko {
public:
Neko() { cout << "A house cat\n"; }
};

class Kitty : public Neko {
public:
Kitty() { cout << "Kitty on your lap\n"; }
};

class Zoo : public Kitty {
public:
Zoo() { cout << "Nekoneko Zoo\n"; }
} obj ;

int main() {
return 0;
}

結果は次のようになりました

A house cat
Kitty on your lap
Nekoneko Zoo

コンストラクタが、最初の基本クラスから開始していることがわかります
上のプログラムはコンストラクタの実験のみですが、派生クラス Zoo は
Kitty と Neko クラスの公開メンバ(及び破保護)を継承します

上の場合は直列的継承ですが
一つの派生クラスが複数の基本クラスを持つ並列的継承も可能です
このような、一つのクラスが複数のクラスを継承することを多重継承と呼びます

基本クラス1 基本クラス2
| |
派生クラス

派生クラスは二つの基本クラスの機能を同時に継承します
この場合、継承する時の構文は次のように記述します

class derived : type base1 , type base2 , ... {

typeにはアクセス指定子を指定します
この場合、コンストラクタは左の基本クラスから順に実行されます
上の場合、base1 , base2 , derived の順でコンストラクタが実行されます
デストラクタは、これの逆の順番で実行されます

#include
using namespace std;

class Neko {
public:
Neko() { cout << "A house cat\n"; }
};

class Kitty {
public:
Kitty() { cout << "Kitty on your lap\n"; }
};

class Zoo : public Kitty , public Neko {
public:
Zoo() { cout << "Nekoneko Zoo\n"; }
} obj ;

int main() {
return 0;
}

これを実行すると、次のようになりました

Kitty on your lap
A house cat
Nekoneko Zoo

基本クラスの指定順でコンストラクタが実行されています

また、派生クラスから基本クラスのコンストラクタに引数を渡すには
派生クラスのコンストラクタで次のような構文を使用します

derived(arg) : base1(arg) , base2(arg) , ... {

argは引数リストです
これも、派生クラスから基本クラスのコンストラクタ呼び出しさえ理解していれば問題ないですね
引数を渡したいコンストラクタが複数あれば、カンマで区切って渡すだけです

#include
using namespace std;

class Neko {
public:
Neko(char *str) { cout << str; }
};

class Kitty {
public:
Kitty(char *str) { cout << str; }
};

class Zoo : public Kitty , public Neko {
public:
Zoo(char *base1 , char *base2) : Kitty(base1) , Neko(base2) {
cout << "Nekoneko Zoo\n";
}
} obj("Kitty on your lap\n" , "A house cat\n") ;

int main() {
return 0;
}

このプログラムでは、基本クラスのコンストラクタに
派生クラスのコンストラクタから引数を渡しています
posted by シンビアン at 11:00| Comment(0) | TrackBack(0) | Symbian OS C++ 実践開発技法 | このブログの読者になる | 更新情報をチェックする

多重継承

multiple inheritance

 オブジェクト指向言語において、クラスを実装する際に、複数の基底クラスから継承を行なうことを、多重継承と呼ぶ。

 C++言語では多重継承が許されている。ただし多重継承を多用すると、同一の基底クラスを持つ異なる複数のクラスを継承するような場合に、継承関係があいまいになる場合があるので、多重継承を行なう際は注意が必要になる。それに対してJavaでは多重継承はサポートされていない。
posted by シンビアン at 10:58| Comment(0) | TrackBack(0) | Symbian OS C++ 実践開発技法 | このブログの読者になる | 更新情報をチェックする

Java訳語対照表

abrupt completion 中途完了
abstract declarator 抽象宣言子
abstract machine 抽象計算機
abstract semantics 抽象的意味
access アクセス
access control アクセス制御
accessible アクセス可能
action 動作
active position 現表示位置
active use 能動的使用
activity 活動
actual argument 実引数
actual function 実際の関数
additive expression 加減式
additive operator 加法演算子
address アドレス
address constant アドレス定数
address operator アドレス演算子
allocate 割り当てる
alphabet アルファベット
ambiguous member あいまいなメンバ
ambiguous name あいまい名
AND expression AND式
append 追加
argument 実引数
argument expression list 実引数式リスト
arithmetic constant expression 算術定数式
arithmetic type 算術型
array 配列
array component 配列の構成要素
array declarator 配列宣言子
array type 配列型
assign 代入する
assignable to 代入可能
assignment 代入,割当て
assignment compatible with 代入互換
assignment conversion 代入変換
assignment expression 代入式
assignment operator 代入演算子
associate 関連付ける
associative 結合的
atomic アトム的
automatic storage duration 自動記憶域期間
B
backslash character 逆スラッシュ文字
base 基数
basic character set 基本文字集合
basic type 基本型
behavior 振舞い
binary compatible バイナリ互換性
binary numeric promotion 二項数値昇格
binary operator 二項演算子
binary stream バイナリストリーム
bitwise logical AND operator ビット単位のAND演算子
bitwise operator ビット単位の演算子
block ブロック
block scope ブロック有効範囲
boolean 論理的,論理..又は 論理の
boolean equality operator 論理型等価演算子
boolean type 論理型
brace 波括弧
bracket 角括弧
break binary compatibility バイナリ互換性を損なう
break statement break文
broken-down-time 要素別の時刻
buffered バッファリングされた
bytecode バイトコード
C
call 呼出し
caller 呼出し側
calling environment 呼出し環境
capacity 容量
case independent 大文字小文字を区別しない
case label caseラベル
cast キャスト
cast expression キャスト式
cast operator キャスト演算子
casting conversion キャスト変換
category 分類
caught 捕捉される
character 文字
character constant 文字定数
character sequence 文字の並び
character set 文字集合
character string literal 単純文字列リテラル
character type 文字型
check 検査
checked exception 検査例外
class body クラス本体
class declaration クラス宣言
class instance クラスインスタンス
class method クラスメソッド
class modifier クラス修飾子
class of the object そのオブジェクトのクラス
class variable クラス変数
clean up クリアする
clear クリアする
cloning クローニング
close クローズする
code 符号
comma operator コンマ演算子
comment 注釈
common initial sequence 共通の先頭列
common type 共通の型
commutative 可換的
commutative operation 可換的演算
comparison operator 比較演算子
compatibility 互換性
compatible 互換の、互換性のある
compilation unit コンパイル単位
compile-time type コンパイル時の型
complete normally 正常完了
completion 完了
component 構成要素
component type 構成要素型
composite type 合成型
compound assignment 複合代入
compound statement 複合文
concatenate 連結する
concurrent 並行
condition 条件
conditional expression 条件式
conditional inclusion 条件付き取込み
conditional operator 条件演算子
conformance 適合性
conforming 適合する
conforming program 適合プログラム
consistent 一貫性
constant 定数
constant expression 定数式
constant field 定数フィールド
constraint 制約
constructor コンストラクタ
constructor parameter コンストラクタパラメタ
context 文脈
continue statement continue文
contract 取決め
control character 制御文字
control line 制御行
controlling constant expression 制御定数式
controlling expression 制御式
conversion 変換
conversion contexts 変換の文脈
conversion specification 変換指定
conversion specifier 変換指定子
copy 複写する
create 生成する
current 現
D
daemon デーモン
deallocate 解放する
decimal constant 10進定数
decimal digit 10進数字
decimal value 10進値
decimal-point character 小数点文字
declaration 宣言
declaration list 宣言並び
declaration specifier 宣言指定子列
declarator 宣言子
declarator type derivation 宣言子型派生
declare 宣言する
decrement デクリメント
default デフォルトの
default argument promotion デフォルト実引数拡張
default constructor デフォルトコンストラクタ
default label デフォルトラベル
default value デフォルト値
definitely assigned 確実に代入された
definition 定義
delimiter 区切り記号
denormalized 非正規化
denote 表す
design 設計
designate 指し示す
digit 数字
digit sequence 数字列
direct abstract declarator 直接抽象宣言子
direct declarator 直接宣言子
direct extension 直接的拡張
direct subclass 直接的サブクラス
direct subinterface 直接的サブインタフェース
direct superclass 直接的スーパクラス
direct superinterface 直接的スーパインタフェース
directive 指令
directly implement 直接的に実装する
directory ディレクトリ
disassociate 切り離す
discuss 記述する
discussion 記述
division operator 除算演算子
do statement do文
documentation comment 文書化注釈
domain error 定義域エラー
double-quote 二重引用符
dynamically enclosed 動的に囲まれる
E
edge 辺
element 要素
element type 要素型
ellipsis 省略記号
else group elseグループ
empty 空
empty statement 空文
end-of-file ファイルの終わり
end-of-file indicator ファイル終了表示子
enum specifier 列挙型指定子
enumerated type 列挙型
enumeration 列挙
enumeration constant 列挙定数
enumeration content 列挙内容
enumeration object 列挙オブジェクト
enumeration specifier 列挙指定子
enumeration tag 列挙タグ
enumerator 列挙子
enumerator list 列挙子並び
environment 環境
environment list 環境の並び
equality expression 等価式
equality operator 等価演算子
equivalent 等価な
error class エラークラス
error condition エラー状態
error indicator エラー表示子
error number エラー番号
escape sequence エスケープシーケンス
evaluate 評価する
event イベント
evolution 機能変更
exception 例外
exception class 例外クラス
exception handler 例外ハンドラ
exception parameter 例外パラメタ
exception-handler parameter 例外ハンドラパラメタ
exclusive OR expression XOR式
execution environment 実行環境
exit 抜け出す,抜出し
exponent 指数
exponent part 指数部
expression 式
expression name 式名
expression statement 式文
extended character set 拡張文字集合
extension 拡張
external declaration 外部宣言
external definition 外部定義
external identifier 外部識別子
external linkage 外部結合
external name 外部名
external object definition 外部オブジェクト定義
F
field フィールド
field declaration フィールド宣言
field width フィールド幅
file name ファイル名
file pointer ファイルポインタ
file position indicator ファイル位置表示子
file positioning ファイル位置付け
final (class) 最終(クラス)
finalizable 終了化可能
finalized 終了化
finalizer 終了化子
finalizer-reachable 終了化到達可能
flag フラグ
floating constant 浮動小数点定数
floating suffix 浮動小数点接尾語
floating type 浮動小数点型
floating-point number 浮動小数点数
floating-point type 浮動小数点型
flush フラッシュする
for statement for文
formal parameter 仮引数
format 書式
formatted input/output 書式付き入出力
forwarding method 転送メソッド
fractional constant 小数点定数
fractional part 小数部
free 解放する
freestanding execution environment フリースタンディング実行環境
full expression 完全式
fully buffered 完全バッファリングされた
function 関数
function body 関数本体
function call 関数呼出し
function declarator 関数宣言子
function definition 関数定義
function designator 関数指示子
function image 関数イメージ
function prototype 関数原型
function prototype scope 関数原型有効範囲
function scope 関数有効範囲
function type 関数型
function-call operator 関数呼出し演算子
G
garbage collection ガーベジコレクション
general purpose 一般用
generate 生成する
global 大域
goal symbol 目標記号
goto statement goto文
gradual underflow 緩やかなアンダフロー
group グループ
group part グループ構成要素
H
handle 取り扱う
header ヘッダ
header name へッダ名
hexadecimal constant 16進定数
hexadecimal digit 16進数字
hexadecimal escape sequence 16進拡張表記
hosted execution environment ホスト実行環境
I
identifier 識別子
identifier list 識別子並び
IEEE Standard for Binary Floating-Point Arithmetic 2進数浮動小数点計算のためのIEEE規格
if group ifグループ
if section if節
if statement if文
implement 実装する
implementation 処理系/実装
implementation limit 処理系限界
implementation-defined 処理系定義の
import declaration インポート宣言
inclusive OR expression OR式
incomplete type 不完全型
inconstant constant 不定の定数
increment インクリメント
indeterminate 不定の
index インデックス、指標
indicator 表示子
inexact 不正確
infinity 無限大
inherit 継承
init declarator 初期化宣言子
init declarator list 初期化宣言子並び
initial shift state 初期シフト状態
initial value 初期値
initialization 初期化
initialized 初期化
initializer 初期化子
initializer list 初期化子並び
input failure 入力誤り
input item 入力項目
input stream 入力ストリーム
input/output 入出力
instance method インスタンスメソッド
instance variable インスタンス変数
instanceof operator instanceof演算子
integer character constant 単純文字定数
integer constant 整数定数
integer literal 整数リテラル
integer suffix 整数接尾辞
integer type 整数型
integral constant expression 整数的な定数式
integral promotion 整数的な拡張
integral type 整数的な型
integrity 完全性
interface modifier インタフェース修飾子
internal identifier 内部識別子
internal linkage 内部結合
internal name 内部名
interrupt 割込み
invocation 呼出し
invoker 呼出し元
involve 含まれる
italic イタリック
iteration statement 繰返し文
J
Java Virtual Machine Java仮想計算機
Java Virtual Machine Specification Java仮想計算機規定
jump statement 分岐文
K
keyword キーワード
Korean (language) 朝鮮語(チョソノ)
L
label ラベル
label name ラベル名
labeled statement ラベル付き文
language 言語
late-bound 遅延束縛
"laziest" form of resolution ”もっとも怠慢な”形式の記号解決
left-associative 左結合
left-hand side 左辺
length 長さ
letter 英字
lexical element 字句要素
lexical grammar 字句文法
library ライブラリ
line 行
line buffered 行バッファリングされた
line number 行番号
linkage 結合
linking リンキング
literal リテラル
live thread ライブスレッド
load ロード
load factor 負荷係数
loading ローディング
local 局所
local variable 局所変数
local variable declaration statement 局所変数宣言文
locale 現地
locale-specific behavior 現地固有の振舞い
lock ロック
logical AND AND
logical AND expression AND式
logical OR OR
logical OR expression OR式
logical source line 論理ソース行
long suffix 長語接尾語
loop body ループ本体
loss of precision 精度の損失
lowercase letter 小文字
lparen 左括弧
lvalue 左辺値
M
main memory 主メモリ
master copy マスタコピー
matching failure 照合誤り
maximum priority 最高優先順位
member メンバ
member-access operator メンバアクセス演算子
meta- メタ
method メソッド
method body メソッド本体
method invocation conversion メソッド呼出し変換
method name メソッド名
method parameter メソッドパラメタ
minus sign 負符号
mode モード
modifiable lvalue 変更可能な左辺値
monetary formatting 金額の書式化
monitor モニタ
multiplication operator 乗算演算子
multiplicative expression 乗除式
multiplicative operator 乗除演算子
N
name collision 名前の衝突
name conflict 名前の競合
name space 名前空間
narrowing primitive conversion プリミティブ型の縮小変換
narrowing reference conversion 参照型の縮小変換
negation 否定
new-line 改行
new-line character 改行文字
no linkage 無結合
non-white-space character 非空白類文字
nondigit 非数字
nonterminal 非終端記号
nonzero digit 非ゼロ数字
normal completion 正常完了
null 空,null
null character 空文字
null literal 空リテラル
null pointer 空ポインタ
null pointer constant 空ポインタ定数
null statement 空文
null type 空型
numeric promotion 数値昇格
numeric type 数値型
numerical comparison operator 数値比較演算子
numerical equality operator 数値等価演算子
O
object オブジェクト
object equality オブジェクト等価演算
object type オブジェクト型
obsolescent feature 廃要素
octal constant 8進定数
octal digit 8進数字
octal escape sequence 8進拡張表記
offset オフセット
open オープンする
operand オペランド
operator 演算子
optional オプションの
optional symbol オプション記号
ordered 順序付ける
ordinary identifier 通常の識別子
output stream 出力ストリーム
overload オーバロード
override 上書き
P
package パッケージ
package declaration パッケージ宣言
padding 詰物
pair 対
parameter 仮引数
parameter declaration 仮引数宣言
parameter list 仮引数並び
parameter type list 仮引数型並び
parenthesis 括弧
passive use 受動的使用
path パス
performance 性能
period ピリオド
physical source line 物理ソース行
plus sign 正符号
point 指す
pointer ポインタ
pointers ポインタ
polar method 極手法
policy 方策,方式
poll ポーリング
polymorphically 多態に
postfix expression 後置式
pp number 前処理数
precedence 優先順位
precise 正確
precision 精度
predefined あらかじめ定義された
preparation 準備
primary 基本
primary expression 基本式
primitive constant プリミティブ定数
primitive type プリミティブ型
printing character 表示文字
priority 優先順位
process プロセス
processor time プロセッサ時問
program プログラム
program execution プログラムの実行
program name プログラム名
program parameter プログラムパラメタ
program startup プログラム開始処理
program termination プログラム終了処理
program text プログラムテキスト
promote 昇格する
property 属性
punctuator 区切り子
Q
qualified access 限定アクセス
qualified name 限定名
qualified type 限定型
qualified version 限定版
R
radix 基数
range error 値域エラー
reachable 到達可能
read 読取り
read error 読取りエラー
reason 理由
reclaim 再利用
recursive 再帰的
redefinition 再定義
reference equality operator 参照型等価演算子
reference type 参照型
referenced type 被参照型
references 参照
reflexive 反射性
relational expression 関係式
relational operator 関係演算子
remainder operator 剰余演算子
replacement list 置換要素並び
requirement 要件
rescan 再走査
reserved identifier 予約済み識別子
resolution 解決
resumed 再開
return statement return文
return type 返却値の型
return value 返却値
right-hand side 右辺
robust 頑健
root ルート
round to nearest 直近への丸め
round toward zero 0に向かう丸め
runtime 実行時
runtime exception class 実行時例外のクラス
S
same class 同一クラス
same interface 同一インタフェース
same type 同一型
scalar type スカラ型
scanlist 走査文字の並び
scanset 走査文字集合
scope 有効範囲
seed 生成源
selection statement 選択文
semantic rule 意味規則
separator character 分離文字
sequence 系列
sequence point 副作用完了点
set セットする
set state セット状態
shallow 浅い
shift distance シフト幅
shift expression シフト式
shift operator シフト演算子
side effect 副作用
sign 符号
signal シグナル
signal handler シグナル処理ルーチン
signal number シグナル番号
signature シグネチャ
signed integer type 符号付き整数型
significant part 有効数字部
simple assignment 単純代入
simple escape sequence 単純拡張表記
simple name 単純名
single-quote 一重引用符
single-type-import declaration 単一の型インポート宣言
source character set ソース文字集合
source file ソースファイル
source file inclusion ソースファイル取込み
space スペース
space character スペース文字
specification 規定
specifier 指定子
specifier qualifier list 型指定子型限定子並び
spelling つづり
standard error 標準エラー
standard exception class 標準例外クラス
standard input 標準入力
standard output 標準出力
state-dependent encoding 状態依存符号化
statement 文
statement label 文のラベル
statement list 文並び
static initializer 静的初期化子
static storage duration 静的記憶域期間
step 段階
storage duration 記憶域期間
storage-class specifier 記憶域クラス指定子
store 記憶する
stream ストリーム
string 文字列
string concatenation 文字列連結
string concatenation operator 文字列連結演算子
string conversion 文字列変換
string literal 文字列リテラル
strongly typed 強く型付けされた
subclass サブクラス
subexpression 副式
subinterface サブインタフェース
subject sequence 変換対象列
subscript 添字
subscript operator 添字演算子
substatement 副文
successful termination 成功終了
suffix 接尾語
superclass スーパクラス
superinterface スーパインタフェース
suppress 抑制する
suspended 一時停止
switch body スイッチ本体
switch statement switch文
symmetric 対称な
synchronizing 同期化する
syntactic grammar 構文文法
syntactic sugar 糖衣構文
syntax rule 構文規則
T
tag タグ
tagged paragraph タグ付き段落
temporary file 一時ファイル
terminating null character 終端空文字
terminating zero-valued code 終端0値コード
text stream テキストストリーム
this book, this manual この標準情報(TR)
thread スレッド
thrown 投げられる
token トークン
tokenizer トークン切出し器
transitive 推移性
translation environment 翻訳環境
translation limit 翻訳限界
translation phase 翻訳フェーズ
translation unit 翻訳単位
treatment 処置
trivial way 自明な方法
truncate 切り捨てる
type 型
type comparison operator 型比較演算子
type conversion 型変換
type definition 型定義
type name 型名
type qualifier 型限定子
type qualifier list 型限定子並び
type specifier 型指定子
type-import-on-demand declaration 要求時の型インポート宣言
typedef name 型定義名
U
unary expression 単項式
unary numeric promotion 単項数値昇格
unary operator 単項演算子
unbuffered バッファリングされていない
unchecked exceptions class 非検査例外クラス
undefined 未定義の
underflow アンダーフロー
underscore 下線
unfinalized 非終了化
Unicode Unicode
unique package name 一意なパッケージ名
unload アンロード
unlock ロック解除
unnamed 名前のない
unordered 順序付けしない
unqualified type 非限定型
unqualified version 非限定版
unreachable 到達不能
unsigned integer type 符号無し整数型
unsigned suffix 符号無し接尾語
unspecified 未規定の
unsuccessful termination 失敗終了
update stream 更新ストリーム
uppercase letter 大文字
use 使用
usual arithmetic conversion 通常の算術型変換
UTF length UTF長
utility ユーティリティ
V
value 値
variable argument 可変個実引数
variable initializer 変数初期化子
verification 検証
verifier 検証器
virtual machine 仮想計算機
void expression ボイド式
volatile object ボラタイルオブジェグト
W
wait set 待機集合
when false 偽の場合
when true 真の場合
while statement while文
white space 空白類
white-space character 空白類文字
widening primitive conversion プリミティブ型の拡大変換
widening reference conversion 参照型の拡大変換
width 幅
working copy 作業コピー
working memory 作業メモリ
wrapper object ラッパーオブジェクト
write 書込み
write error 書込みエラー
posted by シンビアン at 10:57| Comment(3) | TrackBack(0) | Symbian OS C++ 実践開発技法 | このブログの読者になる | 更新情報をチェックする

bit-wise copy

Addendum: Making sense of clone()
It is easy to get confused over this clone business. At the risk of adding to the confusion here are some points to help you think it through.

* This is all about constructing a truly independent copy of an object.
* When objects contain nothing but primitive data it is harmless to make a bit-wise copy of the object, i.e. just reproduce all the data in the object byte by byte.
* The eventual parent class of every class, Object, has a method, clone, that will produce such a bit-wise copy, so if you want to support a bit-wise copy method, you might as well use it, but there are two catches:
o When it runs, it checks to see if the class is declared as implements Clonable. To use it, you will have to declare your class that way, and,
o Just declaring that it implements the Clonable interface will not be enough. You will have to provide a clone method which calls super.clone() on the user's behalf. The model for this trampoline method is in the class Point as given above.
* When an object contains a reference to another object we need to take special care how we go about copying it. If we just copy the reference, then the first object and its copy will share the reference, and the two objects will not be truly independent. We should create a copy of the referenced object, like the Point object that is the origin of all our geometry classes, and use it when creating our copy of the original object.
* When providing a copy constructor as just described we could call it something other than clone, like copy, but that would go against the spirit of naming Java methods so as to convey their significance. If we call the copy constructor method clone we will have to declare the return type as Object and those who call it will have to cast the returned type to the actual class that defines it. However, we no longer need to declare the class as implements Cloneable since we are going to do the copying ourselves, and not just call super.clone().
posted by シンビアン at 10:55| Comment(0) | TrackBack(0) | Symbian OS C++ 実践開発技法 | このブログの読者になる | 更新情報をチェックする

セッション層

別名 : レイヤ5, 第5層

 OSI参照モデルの第5層に位置し、通信の開始時や終了時などに送受信するデータの形式などを規定したもの。

 この層で論理的な通信路が確立される。セッション層からアプリケーション層までの通信方式は単一のプロトコル(例えばHTTP)で定められていることが多い。
posted by シンビアン at 10:54| Comment(0) | TrackBack(0) | Symbian OS C++ 実践開発技法 | このブログの読者になる | 更新情報をチェックする

セッション

WWWにおけるアクセス数の単位の一つ。「ビジット」とも呼ばれる。Webサイトを訪れたユーザがサイト内で行なう一連の行動をまとめて1セッションという。同一のユーザが短時間の間に何ページ読み込もうと、セッションは1である。同一のユーザでも、ある程度間隔が開いた場合は、新しいセッションとしてカウントする。どのくらい開いたら新しい訪問とみなすかについてはいろいろな基準があるが、Web測定の代表的な企業であるInternet Profiles社が採用している30分が、事実上の業界標準となっている。
posted by シンビアン at 10:53| Comment(0) | TrackBack(0) | Symbian OS C++ 実践開発技法 | このブログの読者になる | 更新情報をチェックする

システムリソース

 Windowsで動作するアプリケーションソフトが共通して利用する、特殊なメモリ領域。

 USERリソースとGDIリソースの2つがあり、前者は、アプリケーション操作で開くダイアログやウィンドウなど、ユーザ操作のための情報を格納し、後者は、画面表示に使うフォントやビットマップ画像、アイコンなど、グラフィックス表示関係の情報を格納するのに使う。

 表示には、両者のうち少ないほうの残量を全体のパーセントで表し、これが0%になるとそれ以上アプリケーションやファイルを開くことはできない。

 システムによってあらかじめ容量が決まっており、いくらメモリを増設してもリソースの容量は増えないので注意が必要である。

 16ビットアプリケーションの使う領域と32ビットアプリケーションの使う領域は異なるが、前者の方が圧倒的に制限が厳しいため、残量を考える場合など、ほとんどの場合は前者を指す。

 Windows 3.1以降で確保されているシステムリソースの領域は、16ビットアプリケーション用が計384KB、32ビットアプリケーション用が計6MB(Windows 3.1では32ビット用は確保されていない)。

 システムリソースの不足は、16ビットアプリケーションが多数起動されることによって発生する。本体が32ビットで記述されたアプリケーションでも、アプリケーションが呼び出すライブラリ(DLL)が16ビットベースで記述されていれば、そのDLLが16ビット用リソースを使用するためにリソース不足を発生させてしまうことがある。

 アプリケーションが解放を忘れる(リソースリーク)と、アプリケーションが終了してもリソースは完全には回復しないため、アプリケーションの起動と終了を繰り返していると次第に使用可能なシステムリソースは減少してくる。解放されずに残った領域を使用可能にするためには再起動する必要がある。

 Windows 2000など、Windows NT系列にもシステムリソースの制限はある(NTでは「ヒープ領域」と呼ばれている)が、16ビット・32ビットアプリケーション共に計3MBの領域を使用するようになり、16ビットアプリケーション特有の制限を受けなくなった上に、レジストリ操作によって領域を拡大することもできることから、その制限を気にする必要はなくなっている。
posted by シンビアン at 10:51| Comment(0) | TrackBack(2) | Symbian OS C++ 実践開発技法 | このブログの読者になる | 更新情報をチェックする

システムリソースの空きを増やすには?

以下の作業でシステムリソースの空きを増やすことが可能ですので、お困りの方は試してみてはいかがでしょうか?

* タスクトレイから常駐アイコンを減らす

タスクトレイには多くの常駐アイコンがセットされていますが、これらはリソースを消費しています。
それぞれ、以下の方法で常駐解除することができます。
キーボードインジケータ
1. コントロールパネルの「キーボード」を起動します。
2. [言語] タブをクリックし、「タスクバー上に状態を表示」のチェックを解除します。
スピーカー
1. コントロールパネルの「マルチメディア(サウンドとマルチメディア)」を起動します。
2. [オーディオ] タブの再生グループにある「音量の調節をタスクバーに表示する」のチェックを解除します。
Me の場合 [サウンド] タブの音量(V) グループにある「ボリュームコントロールをタスクバーに表示する」のチェックを解除します。
タスク
1. 「マイコンピュータ」から「タスク」を開きます。
Me の場合コントロールパネルから「タスク」を開きます。
2. タスクフォルダのメニューバーから [詳細設定]−[タスクスケジューラの使用停止] をクリックします。
モデム
1. 「マイコンピュータ」から「ダイアルアップネットワーク」を開きます。
Me の場合、[スタート]−[設定]−[ダイヤルアップ ネットワーク] をクリックします。
2. 接続アイコンを右クリックし、[プロパティ] をクリックします。
3. 「構成(設定)」ボタンをクリックします。
4. [オプション(オプション設定)] タブをクリックし、「モデム状態を表示(モデムの状態をウィンドウ表示する)」のチェックを解除します。
ディスプレイ
1. コントロールパネルの「画面」を起動します。
2. [設定] タブの「詳細」ボタンをクリックします。
3. [全般] タブの「タスクバーに設定インジケータを表示する」のチェックを解除します。
PC カード
1. コントロールパネルから「PC カード(PCMCIA)」を起動します。
2. [ソケットの状態] タブをクリックし、「タスクバー上に状態を表示」のチェックを解除します。
電源
1. コントロールパネルの「電源(電源オプション)」を起動します。
2. [詳細(詳細設定)] タブの「電源メーターをタスクバーに表示する(アイコンをタスクバーに常に表示する)」のチェックを解除します。
時計
1. [スタート]−[設定]−[タスクバーとスタートメニュー] をクリックします。
2. [タスクバーオプション(全般)] タブの「時計を表示」のチェックを解除します。

* システム起動時に自動起動されるプロセスを停止

Windows はシステムを起動する時に、レジストリの run や RunService キーに登録されたプログラムや、WIN.INI の load や run で指定されたプログラム、さらに「スタートアップ」フォルダに登録されたプログラムを自動起動します。これらの中にはリソースを消費するものがあるので、常駐させる必要の無いものは以下の作業で起動しないように設定します。(なお、この作業を行なう前にタスクトレイのアイコン常駐解除を行なった方が、作業は楽になります。)
1. [スタート]−[ファイル名を指定して実行] から MSConfig を起動します。
2. [スタートアップ] タブで起動しないものはチェックを解除して下さい。

主な項目のリストを添付しますので、停止する際の参考にしてください。(停止するとその機能は使えなくなります)
Windows 標準
internat キーボードインジケータ。複数の IME を切り替えない場合は不要。キーボードのプロパティで停止できます。
SystemTray タスクトレイ。止めないことを推奨。
ScanRegistry 起動時のレジストリバックアップ。止めてもリソースに影響しません。
TaskMonitor タスクモニター。デフラグ時に IALA を有効化できます。
関連 FAQ:デフラグトラブル
LoadPowerProfile Windows の省電力機能。
関連 FAQ: LoadPowerProfile が 2 つ起動されています
IrMon 赤外線モニター
ICSMGR インターネット接続共有機能
NetShow PowerPointHelper NetShow ユーティリティ
Hidserv USB キーボード、マウスサポート
参考リンク:再ログオンで USB キーボードの一部ホットキーが使用できない
Taskbar Display Controls 画面の設定。画面のプロパティで停止できます。
SchedulingAgent タスクスケジューラの特定タスク実行
CriticalUpdate Windows Update 重要な更新の通知
アプリケーションの追加と削除で削除を推奨
PCHealth Windows Me システムファイル保護/システムの復元
*StateMgr
SSDPSRV UPnP の SSDP サービス。
関連 FAQ:Windows Me で自動起動されている SSDPSRV って何?
StillImageMonitor スキャナとカメラ
マイクロソフト
ctfmon.exe IME 2002 がインストールする Internat の代替
Machine Debug Manager スクリプトデバッガ (デバッグしない場合は停止を推奨)
MSMSGS MSN Messenger サービス。Messenger のオプションで停止可能。
Loadqm MS Query Manager。MS との通信に使用。停止を推奨。
MSDTC マイクロソフト分散トランザクション制御
Fpx NetMeeting リモートデスクトップ共有
Load WebCheck Internet Explorer 同期タスク
TweakUI TweakUI (止めても復活します。)
Microdoft Office Startup MS Office 製品起動高速化プログラム (停止を推奨)
FindFast MS Office ファイル検索高速化プログラム (停止を推奨)
MOSearch MS Office 2000 以降のファイル検索高速化プログラム (停止を推奨)
Reminder MS Money リマインダー
デバイスドライバ、マルチメディア
AlpsPoint タッチパッドのスクロール、Webアシスト、ホットキーなどの追加機能
EM_EXEC Logitech マウスウェア (マウスの追加機能)
POINTER IntelliPoint ドライバ
gnetmous justy マウスドライバ (マウスの追加機能)
SynTPLpr タッチパッドドライバ
SynTPEnh
Mouse Suite 98 Deamon マウスの追加機能
PRPCMonitor Intel SpeedStep モニタ。止めるとバッテリー駆動時間が短くなります。
WebOutfitterTray Intel WebOutfitter (PIIIユーザー用マルチメディアサービス)
Promon.exe Intel Ethernet ドライバ
LTSMMSG ルーセントモデムドライバ
CountrySelection PC Tel モデム国選択プログラム
PCTVOICE PC Tel モデム音声サポート
YAMAHA DS-XG Launcher YAMAHA DS-XG ランチャー
SxgTkBar YAMAHA ソフトウェアシンセサイザー環境設定
vscvol88 Roland VSC-88 ボリュームコントロール
RealTray リアルプレイヤーツール、RealPalyer の設定で無効化可能
Shockwave init Shockwave 初期化プログラム。不要。
SoundFusion クリスタルサウンドドライバ
AudioHQ サウンドブラスター設定ツール
CTSysVol サウンドブラスター追加ボリュームコントロール
devldr16.exe サウンドブラスター DOS サポート。
SpeedRacer サウンドブラスター関連ソフトウェア
Creative AGP Wizard クリエイティブ AGP 設定ツール
BCDetect Creative 社のビデオドライバサポート
anvshell ASUS ビデオドライバのタスクトレイアイコン
Sis KHooker SIS 社製ビデオの画面調整関係ホットキーサポート
AtiPTA ATI ビデオ設定ユーティリティ
(タスクトレイのアイコンだけなので停止を推奨)
Ati2cwxx
AtiGart
AtiQiPcl
ATIPOLAB
EPSONプリンタウインドウ3環境設定 EPSON プリンタの環境設定ツール
HPDJ Taskbar Utility Hulett-Pacard プリンタ タスクトレイアイコン
LexmarkPrinTray Lexmark プリンタ タスクトレイアイコン
RegShave Fuji FinePix USB ドライバ
Exif Launcher Fuji FinePix USB ドライバ
アプリケーション
JSクィックサーチファイル自動更新 JustSystem のファイル検索用高速化プログラム
Office8 スタートバー JustSystem 社 Office 8 のランチャー
Virtual Drive 住友金属システム Virtual CD 2
Adobe Gamma Loader Adobe の画面調整機能。職人さん以外は停止を推奨
ZoneAlarm ファイアウォールソフトウェア
TrueVector ZoneAlarm のヘルパー
PersFw Tiny Firewall
ConfigSafe SystemSoft 社のシステム状態のスナップショットを取るユーティリティ
外すとかなりリソースをかせぐことができます。
Autochk
Adaptec Direct CD DirectCD (CD-R/RW でパケットライト時に使用)
HatchInside インターネット番号で Web サイトにアクセスするツール
newsupd Creative 社のドライバに付属するスパイウェア
TimeSink A Client PC 内部の情報をCONDUCENT TECHNOLOGIES 社に送信するスパイウェア
Adaware Bootup スパイウェア駆除プログラム
Norton System Doctor ノートン システムドクター。外すとかなりリソースを確保できます。
NAV DefAlert Norton AntiVirus ウィルス定義アラート
Norton Auto-Protect Norton AntiVirus 自動ウィルス保護
Norton eMail Protect Norton AntiVirus e-mail 保護
NAV Agent Norton AntiVirus 2002 Auto-Protect
iamapp Norton Internet Security タスクトレイアイコン
ScriptBlocking Norton Internet Security スクリプト遮断
nisserv Norton Internet Security
PCCIOMON ウィルスバスター リアルタイムモニター
pop3trap ウィルスバスター メールトラップ
Webtrap ウィルスバスター WebTrap
pccguide ウィルスバスター タスクトレイアイコン
pccclient ウィルスバスター自動アップデート
AlogServEXE McAfee Virus Scan
AvconsoleEXE McAfee VirusScan スケジューラ
Vshwin32EXE McAfee VirusScan VShield 機能
VsStatEXE McAfee VirusScan VShield 機能
McAfeeWebScanX McAfee VirusScan
NEC
CyberTrioModeInfo CyberTrio-NX 現在のモード表示
SAService CyberTrio-NX モード設定
外す場合、CyberTrio-NX のアンインストールを推奨
NMFTASK NEC 自動メール受信ユーティリティ
NECMFK ワンタッチスタートボタンの設定
FAX-NX Controller FAX-NX
LUNCH ランチ-NX
ホームページスクラップブックEXスタート ホームページスクラップブックEX (ホームページの自動巡回機能)
アクティブメニューNX アクティブメニューNX
インターネット設定切替ツール インターネット設定切替ツール
ThumbStudio PCカード監視 PC カード挿入の監視プログラム
富士通
PMSet98 電源管理ユーティリティ
LoadBtnHnd FM便利ツール
FM便利ツール FM便利ツール
IBM
TrackPointSrv (daemon) トラックポイントドライバ。外すとスクロール機能などがつかえなくなります。
IBMUltraBayHotSwapSound IBM ウルトラベイデバイスの活線脱着をサポートするドライバ
IBMUltraBayHotSwapCPLLoader
TpHotkey ThinkPad ボタンユーティリティ。
外すと ThinkPad ボタンが使えませんがリソースは空きます。
SONY
PowerPanel PowerPanel (画面横の電源管理などのバー)
HKserve.exe ホットキー機能。外すとホットキー(Fn+α)が使えなくなります。
JOGSERVER2 ジョグダイヤル機能
PPK Setup プログラマブルパワーキー機能
Smart Label OServer Smart Label OServer
CDRFS Warn 過去の CDRFS を読むための機能
東芝
PowerTray 画面の輝度設定
Tesckey 画面の輝度設定
Tfunckey Fn+ファンクションキー機能
Panasonic
Hotkey Fn キーでサスペンドなどを行うときに必要
PTSNOOP Panasonic モデムドライバ
日立
Pivot Software 画面の上下を反転させるツール
KEYMAP Fn+F5/F6 キーで音量調節


* デスクトップのアイコンの数を減らす

デスクトップのアイコンはそれだけでシステムリソースを消費します。最低限のアイコンを残して削除して下さい。
なお、削除(非表示)できないアイコンを消したい場合は TWeakUI で削除できます。
TWeakUI についてはカスタマイズツールをご覧下さい。

* 壁紙をなくす/スクリーンセーバーを変更する

壁紙はかなりのリソースを消費します。また、スクリーンセーバーも種類によっては CPU パワーやリソースを消費します。)
どうしても壁紙が必要でないのなら、以下の作業で (なし) に設定して下さい。
1. コントロールパネルの「画面」を起動します。
2. [背景] タブで壁紙を (なし) に設定します。
3. スクリーンセーバーが必要な場合、[スクリーンセーバー] タブで 3D 以外のスクリーンセーバーを選択します
posted by シンビアン at 10:50| Comment(0) | TrackBack(0) | Symbian OS C++ 実践開発技法 | このブログの読者になる | 更新情報をチェックする

システムリソース

システムリソースはウィンドウマネージャ(USER)やグラフィックエンジン(GDI)が内部的に使用するメモリ領域なので、メインメモリ搭載量とは関係ありません。(ときどき、「システムリソースが不足しています。」というメッセージが出るので、メモリを増やしたのですが...。という人がいますが無意味です。)

システムリソースの残量は、[スタート]−[プログラム]−[アクセサリ]−[システムツール] の「リソースメーター」で把握することができます。
このメーターを見ればわかりますが、システムリソースとして報告されるのは、GDI リソースと USER リソースの少ない方です。

基本的にプログラムやプロセスを起動すれば、リソースは消費されていきます。中でも、グラフィックアプリケーションはその特性から多くのシステムリソースを必要とします。

システムリソース自体は、Windows の仕様によって制限されているので増やすことはできませんが、Windows 起動時の空きリソースを増やすことは可能です。
空きが多ければ「システムリソースが不足しています」というメッセージを見る確率を下げることができます。
(根本的に Windows 9x/Me のシステムリソースの制限から逃れたい場合、NT 4.0 や Windows 2000、Windows XP など NT 系 Windows の使用を検討するといいでしょう。ただ、お使いのアプリケーションやデバイスがこれらの OS でも使用可能かどうかを確認する必要があります。)
posted by シンビアン at 10:47| Comment(0) | TrackBack(0) | Symbian OS C++ 実践開発技法 | このブログの読者になる | 更新情報をチェックする

2006年01月17日

イミュータブル 補足

イミュータブルでないRegionオブジェクトで値の設定メソッドを属性値毎に用意するとどうなるでしょう。

public class Region implements Cloneable {
public Region(double x, double y, double width, double height) {
x_ = x;
y_ = y;
width_ = width;
height_ = height;
}

public final synchronized double getX() {
return (x_);
}

public final synchronized double getY() {
return (y_);
}

public final synchronized double getWidth() {
return (width_);
}

public final synchronized double getHeight() {
return (height_);
}

public final synchronized void setX(double x) {
x_ = x;
}

public final synchronized void setY(double y) {
y_ = y;
}

public final synchronized void setWidth(double width) {
width_ = width;
}

public final synchronized void getHeight(double height) {
height_ = height;
}

private double x_;
private double y_;
private double width_;
private double height_;
}

複数の属性(この場合は4つ)を同時に変更する場合、相互排除を考慮すると以下のようにする必要があります。
マルチスレッド環境では属性の値を変更するのもひと苦労。

Region myRegion = new Region(0, 0, 10, 10);
synchronized (myRegion) {
myRegion.setX(20);
myRegion.setY(50);
myRegion.setWidth(100);
myRegion.setHeight(70);
}
posted by シンビアン at 20:11| Comment(0) | TrackBack(1) | Symbian OS C++ 実践開発技法 | このブログの読者になる | 更新情報をチェックする

イミュータブルでない場合

次にイミュータブルでないバージョンは次のようになります。
setValuesというメソッドを定義したことにより、オブジェクトの値は、このオブジェクトを参照しているかもしれない複数のオブジェクトの中の一つでもその意思を持てば変更できるようになりました。
このため各メソッドでsynchronizedによる相互排除が必要になっています。
synchronizedによる相互排除は即、性能劣化の要因となります。

public class Region implements Cloneable {
public Region(double x, double y, double width, double height) {
x_ = x;
y_ = y;
width_ = width;
height_ = height;
}

public final synchronized double getX() {
return (x_);
}

public final synchronized double getY() {
return (y_);
}

public final synchronized double getWidth() {
return (width_);
}

public final synchronized double getHeight() {
return (height_);
}

public final synchronized void setValues(
double x, double y, double width, double height
) {
x_ = x;
y_ = y;
width_ = width;
height_ = height;
}

private double x_;
private double y_;
private double width_;
private double height_;
}

さらに影響があるのがオブジェクトを使う時。

public class Figure {
public Figure(Region region) {
region_ = region.clone();
}

public Region getRegion() {
return (region_.clone());
}

private Region region_;
}


Regionオブジェクトのクローンをしまくっています。
これは以下のような使われ方をしても誤動作しないため。イミュータブルにしないということは、非常にコストのかかることなのです。

Region myRegion = new Region(0, 0, 10, 10);
Figure figure = new Figure(myRegion);
myRegion.setValue(100, 100, 10, 10); //★もしcloneしていないとFigureのRegion値が変ってしまう
Region anothorRegion = figure.getRegion();
anotherRegion.setValue(10, 50, 200, 100); //★もしcloneしていないとFigureのRegion値が変ってしまう
posted by シンビアン at 20:06| Comment(0) | TrackBack(0) | Symbian OS C++ 実践開発技法 | このブログの読者になる | 更新情報をチェックする

イミュータブルオブジェクトの実装

イミュータブルオブジェクトの例としてX/Y座標の中の範囲を表すRegionを考えてみます。
イミュータブルオブジェクトは以下の方針で実装します。

* 属性値はコンストラクタでのみ設定
* 属性値の参照メソッドを実装
* 属性値の更新メソッドは実装しない
* 属性値を格納するオブジェクト変数はpublicにしない

public class Region {
public Region(double x, double y, double width, double height) {
x_ = x;
y_ = y;
width_ = width;
height_ = height;
}

public final double getX() {
return (x_);
}

public final double getY() {
return (y_);
}

public final double getWidth() {
return (width_);
}

public final double getHeight() {
return (height_);
}

private double x_;
private double y_;
private double width_;
private double height_;
}

イミュータブルオブジェクトの使用例として、Regionを属性値として持つオブジェクトFigureを考えてみます。

public class Figure {
public Figure(Region region) {
region_ = region;
}

public Region getRegion() {
return (region_);
}

private Region region_;
}

一見ごく普通の実装に見えますね。
しかしイミュータブルでない場合と比較すると違いは明らかになります。
posted by シンビアン at 20:03| Comment(0) | TrackBack(0) | Symbian OS C++ 実践開発技法 | このブログの読者になる | 更新情報をチェックする

イミュータブル

イミュータブル(Immutable、不変)というオブジェクトの性質はオブジェクト指向プログラミングにおいて非常に大きな意味合いを持っています。
複製可能である性質、整列化可能である性質はjava.lang.Cloneableや java.io.Serializableというインタフェースによって言語仕様の表層に出ていますが、イミュータブルという性質は言語仕様では直接サポートはされない設計上のコツといったもので、直接取り上げられる機会は少ないといえます。しかしその重要度は決して低いものではありません。

不変という日本語訳からも分かる通り、イミュータブルはオブジェクトの生成時に設定された属性を変更することができないオブジェクトの性質です。
一見、属性を後から変更することができない性質はデメリットであるようにしかみえません。

class Figure {
....

public void move(double x, double y) {
region_.x = x;
region_.y = y;
}

Region region_;
}

としたいところを

class Figure {
....

public void move(double x, double y) {
region_ = new Region(x + region_.getX(), y + region_.getY());
}

Region region_;
}

としなければならないのはあまりにもムダと思えるものです。

しかしイミュータブルにはこの欠点を補ってあまりあるメリットがあるのです。
オブジェクトをイミュータブルとすることのメリットは以下の2つ。

* オブジェクトの所属を気にしなくて良い。
* オブジェクトの相互排除を気にしなくて良い。

つまりオブジェクト指向プログラミングで取り扱わなければならない2つの大きな問題をまったく気にする必要がなくなるのです。プログラミングの負荷の軽減に大きく貢献します。
またこれはプログラミング上の都合だけでなく性能にも影響します。オブジェクトの所属を気にする必要がある場合にはオブジェクトの複製を生成する可能性が高くなり、その処理の分、性能にインパクトがあります。もちろんメモリ資源も余分に必要となりガベージコレクションの発生、ワーキングセットの増大といった2次的な要因も無視できません。

さらにオブジェクトの相互排除ではsynchronizedによるモニタ機能を使用する必要がありますが、この機能を使用することは相応の性能劣化が発生します。
イミュータブルにできるクラスはできるだけイミュータブルとして設計する。これはJavaのプログラミングテクニックとして非常に重要であるといえます。

Javaではjava.lang.Stringがイミュータブルの典型例です。 java.lang.Integerやjava.lang.Floatなどのラッパクラスや、java.awt.Color といったところもイミュータブル。
イミュータブルはすでにJavaのプログラミングテクニックとして広く利用されていることが分かります。
posted by シンビアン at 20:00| Comment(0) | TrackBack(0) | Symbian OS C++ 実践開発技法 | このブログの読者になる | 更新情報をチェックする

コピーコンストラクタ

コピーコンストラクタはC++で良く使われる手法で、オペレータオーバローディングを言語仕様でサポートしているC++ではクラス設計の時の基本要素となっています。
そして、JavaでもC++ほどではないにしても、クラス設計時に意識しておくべき機能であるといえます。

イミュータブルでないカージナルオブジェクトやエンティティオブジェクトを使用する場合、頻繁にオブジェクトのコピーを行うことが必要になります。 (「イミュータブル」参照)
このようなコピーの生成を行うための機能としてjava.lang.Objectにはclone メソッドが定義されており、java.lang.Clonableをインプリメントしたクラスのオブジェクトはこのcloneメソッドで複製を作成できるようになっています。

Foo fooOrg;
...
Foo fooNew = (Foo)fooOrg.clone();

これがJavaでデータの複製を作成するための一般的な方法なのですが、今一つ美しくありません。ちわざわざキャストする必要があるのも悔しいところです。
そこで次のように新しいオブジェクトが生成できるようなオブジェクトを考えてみましょう。

Foo fooOrg;
...
Foo fooNew = new Foo(fooOrg);

何でもない機能のようですが、実際のコーディングがずいぶん楽になります。

このクラスは次のように定義できます。
自クラスを引数にしたコンストラクタを用意するのがポイントです。
このコンストラクタがコピーコンストラクタです。

public class Foo {
public Foo(Foo foo) {
name_ = foo.name_;
}

private String name_;
}

ここまで定義するのあればついでにcopyメソッドを定義しておくと便利です。

public class Foo {
public Foo(Foo foo) {
copy(foo);
}

public void copy(Foo foo) {
name_ = foo.name_;
}

private String name_;
}

のようにしておくことで以下のようなコーディングでエンティティオブジェクトの値の設定が可能になるわけです。

Foo fooOrg = new Foo();
Foo fooNew = new Foo();
...
fooNew.copy(fooOrg);

コピーコンストラクタは便利な機能なのですが、インヘリタンスが発生する場合いわゆるスライシングと呼ばれる副作用が発生する可能性があります。(スライシングについては別途説明する予定です)
スライシングを避けるためにはcloneメソッドを使用することが必要で、結局はこの基本機能に戻ってくることになるともいえます。しかし、コピーコンストラクタを用意することで、プログラミングが楽になるのは確かで、カージナルオブジェクトやエンティティオブジェクトではできる限り用意しておくようにしておくのが得策です。

スライシングが絶対に発生しないことを保証するためにはクラスをfinalにしておく方法があります。カージナルオブジェクトやエンティティオブジェクトの目的からすると、この手法は十分に選択可能であるといえるでしょう。

public final class Foo {
public Foo(Foo foo) {
copy(foo);
}

public void copy(Foo foo) {
name_ = foo.name_;
}

private String name_;
}

posted by シンビアン at 19:53| Comment(0) | TrackBack(1) | Symbian OS C++ 実践開発技法 | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。