Loading presentation...

Present Remotely

Send the link below via email or IM

Copy

Present to your audience

Start remote presentation

  • Invited audience members will follow you as you navigate and present
  • People invited to a presentation do not need a Prezi account
  • This link expires 10 minutes after you close the presentation
  • A maximum of 30 users can follow your presentation
  • Learn more about this feature in our knowledge base article

Do you really want to delete this prezi?

Neither you, nor the coeditors you shared it with will be able to recover it again.

DeleteCancel

Make your likes visible on Facebook?

Connect your Facebook account to Prezi and let your likes appear on your timeline.
You can change this under Settings & Account at any time.

No, thanks

niigata新潟アクセス修飾子のご提案

niigata新潟アクセス修飾子のご提案
by

rti 7743

on 27 April 2012

Comments (0)

Please log in to add your comment.

Report abuse

Transcript of niigata新潟アクセス修飾子のご提案

新潟アクセス
修飾子/指定子のご提案 by rti さて、問題です。 漢字で正確に書いてください。 にいがた ちなみに私はかけませんw 新潟 なんと読みますか? 新潟 という漢字は、 読めるけど、
書けない。 ラーメンズ
不思議の国のニポンより さて クラスの
アクセス修飾子に
不満を持っていませんか? public protected private 私は不満があります。 なんで、
どの言語も
この3つぐらいしか
ないんでしょうか。 アクセス修飾子 クラス外から クラス内から 継承した場合
読み 書き 読み 書き
public ○ ○ ○ ○ 継承される
protected × × ○ ○ 継承される
private × × ○ ○ 継承されない これを変えようという人を
見たことがありません。

神が創った宇宙の法則でもないのに。
なぜ固持するか! 定番の役割 今は
宇宙の法則すら乱れる時代。 今日は、
オブジェクト指向/カプセル化の
幹線にあえて切り込んでみたい。 新潟アクセス修飾子のご提案
~問題提起~ よく getter を作ってませんか? class Human{
private $Age;

public function
__construct($age,$name){
$this->Age = $age;
//略
}

//年齢を取得する.
public fnction getAge(){
return $this->Age;
}
}; クラスの外から
メンバ変数を取得するには、
getterを経由して
アクセスしなければいけない。 //Ageを取るにこうする必要がある。
echo $HumanObject->getAge(); なんか、めんどっちいですよね。 //私は、こうやりたい。
echo $HumanObject->Age; //Ageを取るにこうする必要がある。
echo $HumanObject->getAge(); 比較 class Human{
//private $Age;
//↓
public $Age;

public function
__construct($age,$name)
{
$this->Age = $age;
//略
}

//年齢を取得する.
public fnction getAge(){
return $this->Age;
}
}; これではカプセル化が
壊れてしまう。 //確かにコレはできる。
echo $HumanObject->Age;

//しかし、
//今度は、クラスの外から
//書き込まれてしまう。
$HumanObject->Age = 100; コレは困った。 クラスの外から
読めるけど書けない
そんなアクセス修飾子が
ほしい //コレできても、
echo $HumanObject->Age;


//これはできないでほしい
$HumanObject->Age = 100; そんなわけで
作ってみた。 新潟アクセス修飾子のご提案
~ご提案内容~ クラス外から クラス内から 継承した場合
読み 書き 読み 書き
public ○ ○ ○ ○ 継承される
protected × × ○ ○ 継承される
private × × ○ ○ 継承されない クラス外から クラス内から 継承した場合
読み 書き 読み 書き
public ○ ○ ○ ○ 継承される
niigata ○ × ○ ○ 継承されない
protected × × ○ ○ 継承される
private × × ○ ○ 継承されない public , protected , private , niigata つまり、niigataは
クラスの外から 読めるけど、
書けない!! 新潟 読めるけど、書けない!! 読めるけど書けない 読めるけど書けない 読めるけど書けない php 5.3.2 の
Zendエンジンを改造して
新潟アクセス修飾子を実装 パッチを公開中 //クラスの外から読める
echo $HumanObject->Age;

//だけどクラスの外から書けない
$HumanObject->Age = 100; class Human{
niigata $Age;

public function
__construct($age,$name)
{
$this->Age = $age;
//略
}
}; 無意味なgetterが
消えてすっきり! 無意味な
getterからの解放 新潟アクセス修飾子のご提案
     ~課題~ Q1.新潟のメソッドは
どうするか? class Human
{
//どうしよう。。。
niigata function song()
{
}
}; A1.未サポートです。 現在サポートしていません。
private と同じになります。


C++でいう
const メソッドにしたい。 Q2.protectedな
新潟が欲しい。 継承して使いたい。 A2.今は無理です。 private の拡張として実装。

final ような立ち居地で
独立させるべきかも。

niigata private
niigata protected
みたいな。 Q3.スレッドセーフは? javaでいう
synchronizedは
どうすんの? A3.そんなの関係ねー phpにはスレッドはない。

仮にあったとしても、
スレッドセーフにするのは
個々のクラスの
責任ではない。

上位の専用のクラスの責任である。
そこはgetterで書けばよい。 新潟!? 5・7・5 新潟 ==
読めるけど書けなーい 新潟!! Fatal error: Cannot access niigata property Human::$Age in /home/rti/lab/php-5.3.2/a.php on line 13 @super_rti http://d.hatena.ne.jp/rti7743/ http://rtilabs.net/ 自己紹介 シーランド公国伯爵 イギリス 第二次大戦の要塞後を占拠して独立宣言。
自称国家。
現在、人口4人。

爵位販売中 シーランド公国について 後半の
実装部に続く 嘘です。 アナログ 新潟(niigata)
すげぇぇーー!! class Human{
niigata $Age,$Name,$Address,$Tel;

public function
__construct($age,$name)
{
$this->Age = $age;
//略
}
}; class Human{
private $Age,$Name,$Address,$Tel;

public function
__construct($age,$name)
{
$this->Age = $age;
//略
}
public function getAge(){
return $this->Age;
}
public function getName(){
return $this->Name;
}
public function getAddress(){
return $this->Address;
}
public function getTel(){
return $this->Tel;
}

}; 通常 新潟 そして、
時代は、
getterから
新潟へ 比べてください ハンドル:rti 誰がどうみても 新潟だ 新潟の人ごめんなさい #ダウンロード
#php 5.3.2 本体
wget http://jp2.php.net/distributions/php-5.3.2.tar.gz

#新潟パッチ
wget http://rtilabs.net/files/2010_05_20/niigata.patch

#サンプルその1とその2
wget http://rtilabs.net/files/2010_05_20/niigata_test1.php.txt
wget http://rtilabs.net/files/2010_05_20/niigata_test2.php.txt ##パッチを当てる
#パッチ当てるのがめんどくさい人にはパッチを当てたバージョンもあるよ!
#http://rtilabs.net/files/2010_05_20/php-5.3.2.niigata.tar.gz
#
patch < niigata.patch

##余談
##diffはこうやって作った。
##diff -crN php-5.3.2 php-5.3.2_niigata > niigata.patch #コンパイル
cd php-5.3.2
./configure
make

##サンプルで遊ぶ
#書き込み失敗のサンプル
./sapi/cli/php ../niigata_test1.php.txt

#読み込めることを確認するサンプル
./sapi/cli/php ../niigata_test2.php.txt 新潟 in php 5.3.2 パッチをダウンロードする パッチの適応 コンパイルして遊ぶ これからは新潟だ!! しかも、
カプセル化は破壊されない! いいですか? getter が多い
クラスだと
効果は抜群! Q4.__getでできるよ? php 5.1以上なら
__getで作れば
同じことできるよ。 A4.そ、そうですね。。。 言語仕様として組み込めれば、
作らなくてもOKです。

ソースコードを見ただけで
どれが外部から読みだされるか
簡単に分かります。

また、パフォーマンスも
ネイティヴで書いているので、
__getより5倍ぐらい早いです。 http://ml.php.gr.jp/pipermail/php-dev/2010-May/thread.html class Human
{
private $Age ,$Name, $Address, $Tel;

public function __get( $key )
{
return isset( $this->$key ) ? $this->$key : NULL;
}
}; 伯爵認定書 がたの右上は白ぢゃないよ。 肩書き コレをするにはもっと改造が必要 メンバ変数を外から読むために
よく使いますよね? Q7.外人に
どう説明するの? 新潟 is very difficult.
bad read easy...? 通じるかー A7.ごめんなさい Q6.php以外の
他の言語の対応は? C++とかjavaでもniigataしたい。 A6.そのうちやるかもよ!! それ C# でできるよ! class myClass
{
public int Age
{ get; private set; }
} C# class myClass
{
niigata $Age;
} niigata 新潟の方がタイプ数が少ない。
アクセス修飾子を見ただけでわかる。 good! それ ruby でできるよ! class myClass
attr_reader :Age
end ruby class myClass
{
niigata $Age;
} niigata トータルのタイプ数だとまだ新潟の方が少ないが、rubyはすごいですね。。。 27bytes 31bytes Q5.パフォーマンスコスト 新潟の拡張で
既存のプログラムが遅くならない? 新潟に不利なカウントテスト オリジナル php 新潟 php time sh test.sh
real 0m0.130s
user 0m0.117s
sys 0m0.014s time sh test.sh
real 0m0.130s
user 0m0.117s
sys 0m0.012s <?php
class Counter
{
public $count = 0;
}

$p = new Counter;

for($i = 0 ; $i < 1000000 ; $i ++ )
{
$p->count ++;
}
echo $p->count . "<br>\r\n"; 1000000万回 Lord of Sealand A5.あんまり遅くないですよ
Full transcript