Blogging in A Dampish Dark Place

I am a consumer. As yet I have no name. I’ve no idea where I was born. All I remember is that I was blogging in a dampish dark place.

@propertyと@synthesizeはsetter/getterいらず、、、だけれども。

setter/getterの定義をわざわざ記述しないでも良くなる文法がサポートされてるんだけど、アクセスが容易すぎてカプセル化の観点からすると問題あるんじゃないの?と思ったというお話。

@property を使ってアクセサ定義を省略。

Person.hでPersonクラスを定義。

#import <Foundation/Foundation.h>

@interface Person : NSObject

@property (strong) NSDate *birthday;
@property (copy) NSString *name;
@property double height;

@end

@synthesizeでアクセサ実装を省略

Personクラスの実装Person.m。
@synthesizeで、アクセサの実装を書かずにすむ。コンパイラがうまいことやってくれるらしい。

#import "Person.h"

@implementation Person

@synthesize name;
@synthesize height;
@synthesize birthday;

@end

main.m

こんなmain関数でコンパイル、実行が可能。

#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argc, const char * argv[])
{

    @autoreleasepool {

        Person *personB = [[Person alloc] init];
        [personB setName:@"山田太郎"];     //setterからメンバ変数に代入できる。
        personB.height = 159.5;            //setter使わないでも代入できてしまう。
        NSLog(@"%@ 身長:%.1fcm", personB.name, personB.height);
    }
    return 0;
}

気になるのは、ドット記法でプロパティに値を代入できること。カプセル化の観点からすると、隠蔽しきれていないように見えてしまう。(内部ではアクセサが呼び出されているらしいので、隠蔽できていないという言い方は適切ではないのかもしれないけど)

@interface内で@privateでメンバ変数を定義しても、ドット記法は無効にならない。内部でアクセサ(setter)が呼び出されているのだから、まぁ、そうなるだろう。

しかし、それならということで、@property句の所でreadonly指定したら、setterからメンバ変数に代入することも出来なくなってしまった。

Java的な発想なのかもしれないが、このドット記法は使っていいものか迷うところだ。

ドット記法での代入だけを防ぐ方法はないものだろうか。


ちなみに実行結果

山田太郎 身長:159.5cm

広告を非表示にする