目的Cを理解する:メソッド呼び出し

健康なプログラマーがObjective-Cでメソッド呼び出しを初めて見たとき、彼の目は落ちます。

それについて話しましょう。

理論


メソッドを呼び出すときに、各パラメーターに人間の名前を付けると想像してください。 今ではファッショナブルで、通常は引数にハッシュが渡されます:

Php
$image > calculateSize (配列(
'image' => $ image
'width' => 50
'高さ' => 50
));

Javascript
image CalculateSize ({
画像 画像
50
高さ 50
});

呼び出しコードでは非常に便利で明白です。 パラメータと転送順序を覚える必要はありません。 異なるパラメーターセットなどで同じメソッドを作成する必要はありません。

Objective-Cでは、作成者はこの規則を言語構文レベルで修正することを決定しました。 各パラメーターには名前があります。 メソッドを呼び出すときとメソッドを定義するときの両方に示されます。 したがって、プログラマーがコードの不udge慎だけでなく、物事本質について考える必要がある場合、プラクティスは厳密に実装されます。

ただし、1つのパラメーターで多数のメソッドが呼び出されます。 この場合、明らかに、個別に名前を付けることは意味がありません。 メソッド自体の名前から、すべてが通常明確です。

$records -> storeData ( 'sirko.db' );
$users -> findNickname ( 'vasya' );

Objective-Cには、このケースのための単純化された構文があり、通常は初心者に混乱をもたらします。 メソッドの最初のパラメーターには名前がありません。 このように:すべてのパラメーターには名前が付けられ、最初のパラメーターには名前が付けられません。 スクリプト言語の1つでは、これは次のようになります。

Php
$this -> calculateSize ( $image , array(
'width' => 50 ,
'height' => 50
));

Javascript
image -> calculateSize ( image , {
width : 50 ,
height : 50
});

これがObjective Cを理解する上での主な問題だと思います。経験豊富なプログラマは、ほとんどすべてのプログラミング言語のロジックを直感的に理解しますが、この「秘密の知識」がないと、Objective-Cをすぐに理解できません。

それは興味深い副作用であることが判明しました。 具体的に考案されたのか歴史的に開発されたのかはわかりませんが、メソッドの名前に最初のパラメーターの名前が付けられています。

例: findUserByNickname, locateByCoordinates, storeIntoFilename, loadFromTable, setupByIdなど。 そのようなネーミングシステムはここで完全に定着しました。その結果、Objective-Cコードは平均して読みやすくなっています。

練習する


そして今、スライド。

content = [answersTable findById:42];

Objective-Cのメソッド呼び出しは、角括弧で書かれています。 最初はオブジェクト変数です。 次に-メソッドの名前とコロンを介したパラメーター。 answersTableは優れたオブジェクトのインスタンスであり、 findByIdはメソッドであり、 42は適切な数です。 結果はcontent.変数に返されますcontent. 記憶法則:角括弧は、内容の計算に置き換えられます。 ( Tclのように)。

他の言語では、次のようになります。

$content = $answersTable -> findByid ( 42 );

そして、これが素晴らしいオブジェクトのメソッドのまさに定義です:

- ( AnswerContent * ) findById : ( int ) questionId {
...
[ self doSomething : questionId ] ;
...
}

マイナス記号を使用すると、オブジェクトメソッドの定義が開始されます。 C: (AnswerContent *)ように、括弧内に返されるデータ型、ポインターがあります。 簡単に言えば、これはメソッドがAnswerContent型のオブジェクトを返すことを意味します。 次は、メソッドの名前( findById )であり、コロンを介して-C: (int) questionIdように、そのタイプの必須指示もある最初のパラメーターの変数です。

メソッド内で、 questionId.変数にアクセスできますquestionId.

他の言語では、次のようになります。

Php
public function findById ( $questionId ) {
...
$this -> db -> get ( $questionId );
...
}

Javascript
Smth . prototype . findById = function( questionId ) {
...
this . db . get ( questionId );
...
}

今-問題を理解する上で最後かつ最も困難なステップ。

masterpiece = [ gallery findImageByWidth : 400 andHeight : 300 ] ;

これは、2つのパラメーターを持つメソッドが呼び出される方法です。 最初の( " 400 ")には名前がなく、メソッド名の直後に示されます。 2番目はandHeightと呼ばれます。 メソッドとそのパラメーターの名前のエレガントさに注意してください。 しばらくすると、このような文章の読み書きに慣れ、「ギャラリー、plsは幅と高さで画像を検索します」と自分に言います。

多くのパラメーターがあります。

price = [ trade calculateWithPrice : 25.55 volume : 500 value : 3 ticker : aaplTicker ] ;

角かっこ内-1つのオブジェクトで1つのメソッドを呼び出すだけで、混乱することはありません。

別のプログラミング言語では、これは次のように聞こえます。

Php
$price = $trade -> calculate (array(
'price' => 25.55 ,
'volume' => 500 ,
'value' => 3 ,
'ticker' => $aaplTicker
));

Javascript
price = trade . calculate ({
price : 25.55 ,
volume : 500 ,
value : 3 ,
ticker : aaplTicker
});

そして、このメソッドの定義は次のとおりです。

- ( float ) calculateWithPrice : ( float ) price volume : ( int ) volumeAmount
value : ( int ) value ticker : ( TickerClass * ) ticker {
...
}

同様に、マイナス、返されるデータのタイプ、メソッド名、最初のパラメーターのタイプおよび変数が示されます。 次に、スペースの後に-次のパラメーターの名前、そのタイプと変数。 などなど。

重要なポイント。 メソッド内では、パラメーター名は使用されません。 これを説明するために、2番目のパラメーターにvolume,という名前を付けましたが、変数volumeAmount.配置されていますvolumeAmount. メソッド内でアクセスできます:

volumeAmount += 10 ;

しかし、 volumeたい場合、コンパイラーは反対し、 そのような変数は存在しません。 ただし、 priceというパラメーターは、同じ名前の変数に配置されます。 すべてがシンプルです:

price = price * 0.90 ; // a better discount for our customer

ほとんどの場合、簡単にするために変数とパラメーターの名前は同じように書かれています。

そして、デザートの場合-パラメータなしで何も返さないメソッド:

呼び出し:
[ self destroy ] ;

定義:
- ( void ) destroy {
...
}


結論


このメソッド呼び出しメソッドは、当然のことながら最初は自然に拒否を引き起こします。 これは正常です。 最初のパラメーターに関する秘密の知識がなければ、Objective-Cのコードをすぐに読むことは不可能であり、これは面倒で、さらに経験豊富なプログラマーです。 そして、蓄積された刺激は、すぐにその原因に関連付けられます。

しかし、あなたが正しい方法で-戦いなしで理解し、受け入れるなら-これらの原則やその他の原則は完全にネイティブで理解可能になります。 Objective-Cは長年愚かな人々とはかけ離れて開発されてきましたが、根本的に間違ったことはありません。 Objective-Cは、それ自体が美しいです。

また、Objective-Cでのプログラミングの経験は、特に命名の新しい文化を実践にもたらします。 これにより、あらゆる言語のコードが勝ちます。

経験豊富な専門家向けのPS:これは初心者向けの記事です。 したがって、私は主なことに集中するために意味をいくぶん誇張しました。 特に、メソッドが実際に呼び出される方法などについては触れませんでした。

Source: https://habr.com/ru/post/J103221/


All Articles