2014-01-24 45 views
1

我有我的NDVector類這種方法,找出兩個向量之間的角度沿兩個軸(三維向量,這意味着你可以找到它們之間的角度正好條款他們的X和Y分量,X和Z分量,或Y和Z分量):如何避免Objective-C的方法名稱中使用「和」

- (float) angleBetweenThisAnd: (NDVector *) vector2 byAxis: (NSUInteger) axis1 and: (NSUInteger) axis2; 

我不認爲我利用描述性的命名,你可以用它採取Objective-多個參數的方法做C。我發現自己做了很多,真的。我想到了這種方法,說它是一個句子,它沒有用簡單的英語(即[someVector angleBetweenThisAnd: otherVec ...]而不是[someVector findsAngleBetweenItselfAnd: otherVec ...])說明它的主語和它的動詞之間的關係,然後把它寫作方法名稱,但似乎很冗長「和」以方法的名義。我的意思是,當然是!

在Java中,命名方法是簡單了很多,但在Objective-C,我在方法名純英文和代碼之間的密切關係感到困惑。最重要的是,是否有一種避免以方法名稱使用「和」的常用方法?

+0

你的方法只接收一個矢量... –

+0

@nickfalk但它需要兩軸,這也正是「和」爲 – michaelsnowden

+0

也許有「太多」在英語中的OBJ-C次?考慮'float angleBetween:Vector axis1:Axis axis2:Axis'具有'float angleBetween(Vector v,Axis axis1,Axis axis2)''的簡單Java簽名映射'。 – user2864740

回答

3

查看一些NSDate比較方法的靈感。

例如,以下像timeIntervalSinceDate:descriptionWithCalendarFormat:timeZone:locale:圖案,怎麼樣[NDVector angleWhenIntersectingWithVector:axis1:axis2]

這可能是這樣的:

- (float) angleWhenIntersectingWithVector:(NDVector *)vector2 
            axis1:(NSUInteger)axis1 
            axis2:(NSUInteger)axis2; 
+0

完美。這裏的關鍵是隱含了「this」或「self」(或者,實際上,它存在於消息發送語法中),因此您不需要「and」。 –

+0

是的,我喜歡使用with來暗示自我 – michaelsnowden

+0

請注意,如果'axis1'和'axis2'可以互換而不影響返回值,那麼您可以只使用'axis:'關鍵字兩次(同時仍以不同的方式命名參數),例如'angleWhenIntersectingWithVector:(NDVector *)vector2軸:(NSUInteger)axis1軸:(NSUInteger)axis2'。方法[' - [NSObject performSelector:withObject:withObject:]'](https://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/occ/intfm/NSObject/performSelector:withObject:withObject :)執行此操作。 –

0

如果你看一下你的方法你做,你真的不是描述與方法本身。你是對的,使用「和」永遠不會好,使用「和」作爲參數描述是可怕的。這樣想,如果你沒有命名的輸入參數,你怎麼能(或者別人)說出它是什麼(即在代碼中內聯)?

例如: - (浮點)angleBetweenThisAnd:byAxis:和:

在使用

: [currentThing angleBetweenThisAnd:myvec會byAxis:B和:K];

什麼是「本」,在第一個輸入參數?我應該通過什麼「和」?什麼是「和」價值應該是?也許你是唯一使用你的代碼的人,但時間會來臨,你沒有看過它,忘記它是如何工作的。

想想把一個描述性單詞的方法名。通過具有描述性文本的方法名稱,任何人都可以讀取它,尤其是當您在代碼中調用它時,因爲這些值不會有它們的類型或默認名稱。我會重寫你的方法:

- (float)angleBetweenVector2:(NDVector *)vector2 withAxis1:(NSUInteger)axis1 withAxis2:(NSUInteger)axis2;

1

有可能寫出沒有名稱的方法參數。這種情況並不常見,但偶爾也是最簡潔的代碼風格。

- (float) angleWithVector:(NDVector *)vector2 axes:(NSUInteger)axis1 :(NSUInteger)axis2; 

[vector angleWithVector:otherVector axes:b :K] 

@selector(angleWithVector:axes::) 
0

另一種方法解決問題的題是問

「如何簽名的工作時,有沒有參數名」

所以你的原始版本。

angleBetweenThisAnd:byAxis:and:掃描得不好。

而阿龍的版本確實...

angleWhenIntersectingWithVector:axis1:axis2:

方法簽名現在給它用來做什麼,而不在ARG名稱嵌入信息的明確指示。

0

您的評論後:如果你有自由,你可以使用一個枚舉,而不是一個結構:

typedef enum { XAxis = 1, 
       YAxis = 2, 
       ZAxis = 4, 
       XYPlane = 3, 
       XZPlane = 5, 
       YZPlane = 6 
      } AxisOrPlane; 

- (float) angleAtIntersectionWith:(NDVector *)vector inPlane:(AxisOrPlane)plane 

枚舉值都被接走所以XYPlane相當於XAxis | YAxis等等,但你不知道需要這樣做。

當然工作的一個結構的意志爲好,例如:

typedef struct { NSUInteger axis1; NSUInteger axis2; } Plane; 

- (CGFloat) angleAtIntersectionWith:(NSArray *)vector inPlane:(Plane)plane 

和調用該方法時,可以使用文字的結構:

[aVector angleAtIntersectionWith:anotherVector面內:(平面){ x軸,z軸}];

其中XAxisYAxis被適當地定義。

HTH

+0

我喜歡這個答案,但不幸的是,它必須是一個NDPlane,所以我不能像這樣編號我的座標軸(數字會延伸到無窮大)。如果你有解決方案(我想不出任何),那麼我同意你的方法更好,更好。 – michaelsnowden

+1

@doctordoder - 你有多少維度?一個枚舉可以處理64,但是你想列出所有可能的2016對作爲枚舉常量(但你可以寫一些代碼來爲你寫入枚舉聲明......)!聽起來像一個結構是要走的路,只要記住結構文字('(NDPlane){axis1,axis2}')作爲創建結構值的簡單方法。 – CRD

+0

理論上,它應該支持無限(它可能會在13之後崩潰),但是結構字面量的語法對我來說看起來非常完美! – michaelsnowden

相關問題