Javaプログラマーのための衝撃的なObjective-C

この記事は何についてですか?


2つの事実。 世界には多くのJavaプログラマーがいます。 Objective-Cの人気は高まっています。 結論:Objective-Cを学習するJavaプログラマーは珍しくありません。 言語間の主な違いを知っている場合、Javaの既存の知識を効果的に使用して、Objective-Cの記述をすぐに開始できます。

私はCで始め、過去15年間Javaで書いて、時にはC ++、Python、Perlに切り替え、Scalaを興味を持って見ていました。 そして今、Objective-C。

各旅行から、通常、「私たち」と「彼ら」の最も面白い違いに関するいくつかの物語があります。 完全なふりをすることなく、Objective-Cの機能について説明します。これは、Javaからの異星人として私を特に驚かせました。 後で、これらの機能を理解または拒否すると、Objective-C構文で記述されたJavaコードが生成されることに気付きましたが、Objective-Cコードだけを記述する方がはるかに自然です。 言語は構文だけでなく、主にイディオムです。 繰り返しますが、これはガイドではなく、旅行者のメモです。 興味深いと思われる場合は、今後の記事で観察結果について引き続き説明します。

メソッドではなくメッセージを送信します


Java:
object.method(param);

Objective-C:
[object method:param];


Java , Objective-C — . . -, , ( , , , Java ), (selector), -. , , .

, Java , (warning). — . — .

?


Java:
public Feature addFeature (String name, String value, boolean isOptional);

Objective-C:
-(Feature*) addFeature :(NSString*)name withValue:(NSString*)value asOptional:(BOOL) optional:


Objective-C “” . , , addFeature:withValue:asOptional:

SEL selector = @selector(addFeature:withValue:asOptional:);

, , , 16 . 16 .

: ,



Java

Objective-C:
@interface NSString (LetsAugment)
-(BOOL) isGoodActor;
@end


, NSObject. (category). LetsAugment, isGoodActor NSString. NO (false Java), , YES (true) , . — :

if ([@”Steven Seagal” isGoodActor]) NSLog (@”Yeah!”) else NSLog (@”What's wrong with you?”);

, , .

, -, . , , . . -, .

:


Java:
MyTao tao = null;
int howManyHands = tao.clap();

Objective-C:
MyTao* tao = nil;
int howManyHands = [tao clap];


, , NullPointerException , , . — howManyHands 0. 1, , .

. nil (null Java), (nil, 0, NO ..). , .
Java: ()

class Profile {
int getVersion() {
...
}

class Feature {
Profile getProfile(String name) {
...
}

class Phone {
Feature getFeature(String name) {
...
}

class PhoneFactory {
static Phone designAndProduce(String model) {
...
}
}

...
int version = 0;
Phone phone = PhoneFactory.designAndProduce(“iphone5”);
Feature btFeature = phone.getFeature(“bt”);
if (btFeature != null) {
Profile profile = btFeature.getProfile(“a2dp”);
if (profile != null) {
version = profile.getVersion();
}
}



Objective-C:

@interface Profile : NSObject
@property (readonly) int version;
@end

@interface Feature : NSObject
- (Profile*) getProfile:(NSString*)name;
@end

@interface Phone : NSObject
+ (Phone*) designAndProduce:(NSString*)name;
-(Feature*) getFeature:(NSString*)name;
@end
...

Phone* phone = [Phone designAndProduce:@"iphone5"];
Feature* btFeature = [phone getFeature:@"bt"];
Profile* profile = [btFeature getProfile:@"a2dp"];
int version = profile.version;



Objective-C Java . [phone getFeature:@«bt»] nil, version 0.

« »? nil , , , . (getter/setter). , Objective-C (- profile.version?) — (property), .


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


All Articles