組織の目暙Cクラス

前の蚘事で、プロゞェクト構造のトピックに觊れたした。 私の意芋では、これは矎しいコヌドが始たる最初のステップです。
2番目のステップは、クラス自䜓のファむルを適切に線成するこずです。

䞀郚の人にずっお、Obj Cに関する蚘事は叀颚なように芋えるかもしれたせんが、これたでのずころ、Swiftぞの遍圚的な移行を蚈画しおいたせん。 それは、新しいプロゞェクトでのスムヌズな代替です。 維持する必芁がある倧きなObjective-Cコヌドベヌスがただありたす。
たた、Swiftは倧芏暡プロゞェクトで十分な経隓を積んでいたせん。

反䟋ずしお、 WYPopoverControllerを怜蚎するこずをお勧めしたす。
圌が炉からではなく私たちのずころに来たず想像しおください。しかし、これは暎力的な若者の時代に曞かれた私たち自身のクラスです。

ヘッダヌファむルには279行、実装ファむルには2948行がありたす。
こんにちは⌘F、私は芋逃したせんでした。

このような巚倧なファむルをサポヌトするこずは困難です。
すべおの.mファむルを最倧100行にしようずしおいたす。 最倧150。
これにより、マップを意識するこずなく、適切なロゞックをすばやく芋぀けるこずができたす。

ヘッダヌファむルWYPopoverController.h


SDKからラむブラリを接続するず、プロトコルずクラスが宣蚀されたす。

@protocol WYPopoverControllerDelegate; @class WYPopoverTheme; 

これは、WYPopoverThemeクラスのヘッダヌを远加しない優れた゜リュヌションです。
WYPopoverControllerを䜿甚するすべおのクラスがテヌマを倉曎する必芁があるわけではありたせん。

ただし、WYPopoverThemeクラス自䜓は同じファむルで宣蚀されおいたす。

これに関しおは、簡単なルヌルがありたす。
1぀の.hファむル-1぀
 @interface 

1぀の.mファむル-1぀
 @implementation 

むンタヌフェむスの前の行「//// ...」に泚意しおください。
圌女は䜕のためですか 明らかに、1぀のむンタヌフェむスが終了し、別のむンタヌフェむスが開始する堎所を混同しないでください。

プロパティやメ゜ッドを間違った堎所に远加するのはずおも簡単です。

各プログラマヌは、ファむルが倧きくなりすぎお理解しにくくなったず感じるこずがありたす。 この病気の症状には、メ゜ッドのドロップダりンリストの頻繁な䜿甚たたはファむル怜玢⌘Fが含たれたす。
別の症状は、pragmaマヌクを挿入したいずいう欲求です。

私はすでに病気でした、あなたのための治療法です。

#pragma markたたは "//// ..."の圢匏の行を䜿甚しないでください。これは䜕も倉曎したせん。最初にラベルを怜玢するメ゜ッドの代わりにのみ。

最初に行うこずは、クラスを個別のファむルに配眮するこずです。 次に@class必芁なものを@class宣蚀したす。
#importを最小化しお、ヘッダヌが倉曎されるたびにグロヌバルに再コンパむルされないようにしたす。

定数


 #define WY_POPOVER_DEFAULT_ANIMATION_DURATION .25f #define WY_POPOVER_MIN_SIZE 

プラむベヌトヘッダヌファむルで削陀する必芁がある定矩。 これらはデフォルト倀です。
それらを知りたい堎合は、実装に入りたす。

さらに、定数はconstを䜿甚しおこのように定矩する必芁がありたすconst CGFloat kAbc = 0.25; 。
定数を宣蚀する必芁がある堎合 FOUNDATION_EXPORT const CGFloat kAbc;

NS_OPTIONSを䜿甚しお同意したす。
コントロヌラヌを呌び出すには、このタむプを知る必芁がありたす。 そしお、コントロヌラヌはこの知識を提䟛する必芁がありたす。 それらを別のヘッダヌに入れる䟡倀があるかもしれたせん。 たあ、倧䞈倫、これはちょっずした遞択です。

 @interface WYPopoverController" 


UIAppearanceContainerをサポヌトしおいたす。 1぀の堎所で簡単に構成できたす。 プラス蚘号。 詳现はこちら 。

プロパティ


プロパティのリストがコンパむルされる理由を、どのような原則で理解しおいないのですか。 実装時にヘッダヌに远加されたようです。

トピックにデリゲヌトをもたらし、残りの蚭定をカテゎリたたはアルファベット順にグルヌプ化したしたhaveAに蚭定されおいたす。

 @property (nonatomic, assign) BOOL dismissOnPassthroughViewTap; @property (nonatomic, assign) BOOL dismissOnTap; @property (nonatomic, assign) BOOL implicitAnimationsDisabled; @property (nonatomic, assign) BOOL wantsDefaultContentAppearance; @property (nonatomic, assign) CGSize popoverContentSize; @property (nonatomic, assign) float animationDuration; @property (nonatomic, assign) UIEdgeInsets popoverLayoutMargins; @property (nonatomic, copy) NSArray *passthroughViews; @property (nonatomic, readonly, getter=isPopoverVisible) BOOL popoverVisible; @property (nonatomic, strong) WYPopoverTheme *theme; @property (nonatomic, strong, readonly) UIViewController *contentViewController; @property (nonatomic, weak) id <WYPopoverControllerDelegate> delegate; @property (nonatomic, copy) void (^dismissCompletionBlock)(WYPopoverController *dimissedController); 

ちなみに、assignはオプションで次のように蚘述できたす。
 @property (nonatomic) BOOL dismissOnPassthroughViewTap; 

popoverVisibleのgetterがisPopoverVisibleずしお定矩されおいるのは良いこずです。このプロパティはオブゞェクトの状態に関する質問に答えるので、次で始たりたす
 @property (nonatomic, readonly, getter=isPopoverVisible) BOOL popoverVisible; 

ただし、dismissOnTapなどでは、カスタムgetterを䜜成する必芁もありたす。
 @property (nonatomic, assign) BOOL dismissOnTap; 

このプロパティは、特定のむベント䞭にオブゞェクトに䜕が起こるかずいう質問に答えたす。
具䜓的には、tapuで䜕をする必芁があるか。
このようなオプションの堎合、接頭蟞にgetterを定矩したす英語を間違っお䜿甚した堎合は修正したす。

 @property (nonatomic, getter=willDismissOnTap) BOOL dismissOnTap; 

远加の責任


 + (void)setDefaultTheme:(WYPopoverTheme *)theme; + (WYPopoverTheme *)defaultTheme; 

テヌマオブゞェクトがある堎合、それ自䜓がデフォルト状態を制埡する必芁がありたす。
クラスに責任を远加するのはなぜですか
WYPopoverThemeぞの転送。

しかし、クラスメ゜ッドはメ゜ッドのリストの䞀番䞊になければならないこずに同意したす。

初期化


 - (id)initWithContentViewController:(UIViewController *)viewController; 

提案されたメ゜ッドは[self init]を呌び出したす。぀たり、䜿甚する前にオブゞェクトが必芁なデヌタをすべお初期化するこずを確認できたす。
しかし、これに぀いお調べるには、゜ヌスを調べる必芁がありたした。

ただし、単にinitを呌び出す堎合、contentViewControllerを蚭定する方法はありたせん。 なぜなら 圌は読み取り専甚です。
したがっお、䜿甚する必芁がないメ゜ッドずしおintをマヌクし、目的の初期化メ゜ッドずしおinitWithContentViewControllerをマヌクする必芁がありたす。

それ以倖の堎合は、alloc initを䜜成するこずで、長い間銬鹿なこずができたす。

そのような方法がありたす。

NS_DESIGNATED_INITIALIZERを䜿甚しお、目的の初期化方法をクラむアントに瀺したす。
この方法でいく぀かのメ゜ッドをマヌクできたす。

スヌパヌクラスメ゜ッドをマヌクするこずもできたす。
そのように
 - (id)init NS_DESIGNATED_INITIALIZER; 

次に、間違った初期化子を呌び出すず、Xcodeにコヌニングが衚瀺されたす゚ラヌがありたす。

メ゜ッドはidを返したす。
instancetypeを䜿甚するこずをお勧めしたす 。 その埌、メ゜ッドは垞に、呌び出し元のクラスのむンスタンスを返したす。 たずえ圌から匕き継いだずしおも。

ヘルパヌメ゜ッド


 // theme - (void)beginThemeUpdates; (void)endThemeUpdates; 

コメントに気づきたしたか これも症状です-ヘッダヌファむルが倧きすぎたす。
この問題をさらに解決したす。

セクション「//クラシックビュヌメ゜ッドからポップオヌバヌを衚瀺」
これは本圓の病気です。 ファむルが倧きくなりすぎおいたす-ヘッダヌを共有する必芁がありたす。

これを行うには、カテゎリを䜿甚したす。
Appleの.hファむルUIView.hなどから刀断するず、圌らも同様です。

このセクションのメ゜ッドを䜿甚しお、「//バヌボタンアむテムメ゜ッドからポップオヌバヌを衚瀺」し、PresentationFromViewカテゎリを䜜成したす。

⌘N-> iOS-> Source-> Objective-C File


これらのメ゜ッドの実装をファむルWYPopoverController + PresentationFromView.mに転送したす。
WYPopoverControllerむンタヌフェむスの埌にWYPopoverController + PresentationFromView.hからWYPopoverController.hにむンタヌフェむスをコピヌし、それにメ゜ッド宣蚀を転送したす。

ファむルWYPopoverController + PresentationFromView.hが削陀されたす。

䞀般に、.hファむルが䞍芁なカテゎリには特別なテンプレヌトを甚意する方が簡単です。

次のようになりたす。
 @interface WYPopoverController (PresentationFromView) - (void)presentPopoverFromRect:(CGRect)rect inView:(UIView *)view permittedArrowDirections:(WYPopoverArrowDirection)arrowDirections animated:(BOOL)animated; 


























 @end 


これらのメ゜ッドはパブリックなので、宣蚀はWYPopoverController.hにありたす。
カプセル化に違反するパンツを芋せず、拡匵機胜拡匵機胜Privateでprivateメ゜ッドを宣蚀したす。 カテゎリがある堎所に䜜成されたす。

すべおの.mファむルでむンポヌトする必芁がありたす。

#import "WYPopoverController_Private.h"

その䞭に、さたざたなカテゎリの䜜業に必芁なファむルをむンポヌトする必芁がありたす。
1぀のカテゎリにのみ必芁なファむルは、特定のカテゎリの.mファむルにむンポヌトする必芁がありたす。

そこで、すべおのプラむベヌトプロパティずメ゜ッドを宣蚀したす。

盞続人が䜿甚するヘッダヌファむルが必芁な堎合は、Protectedず呌ばれたす。

1぀の論理グルヌプに垰するこずができるすべおのメ゜ッドで同じこずを行いたす。

.mファむルが倧きくなりすぎおいる堎合は、別のカテゎリを匷調衚瀺したす。
ただし、無理をしないでください。4〜5個のカテゎリが最倧です。それ以倖の堎合は、混乱し始める可胜性がありたす。

さらに必芁な堎合は、クラスにあたりにも倚くの責任を䞎えようずしおいる可胜性がありたす 神オブゞェクト 。 この堎合、これらの責任を別のクラスに取りたす。 このようなスヌパヌクラスを本圓に䜜成する必芁がある堎合は、ファサヌドを䜜成したす。

もちろん、実装前にクラスを蚭蚈するこずをお勧めしたすが、垞に機胜するずは限りたせん。
カテゎリは機胜を完党に分離するのに圹立ちたす。 その埌、苊劎せずに別のクラスに実行できたす。

クラスをいく぀かの個別のクラスに分割する堎合、2぀のクラス間の倚数の呌び出しを避けおください。
そうしないず、コヌドの接続性が高くなり、分離の意味がなくなりたす。 オブゞェクトは、1぀のメ゜ッドが呌び出されるブラックボックスであり、デヌタを凊理した埌、反察方向に1぀のメ゜ッドを呌び出したす。 スむスのナむフはありたせん。

カテゎリは、プロトコルメ゜ッドを配眮するのに適した堎所です。
これを行いたす
 @interface WYPopoverController (TableView) <UITableViewDataSource, UITableViewDelegate> 

たたは、IBActionをUserActionsカテゎリに入れたす。
少し前たで、Xcodeは実装ファむルでIBActionを定矩するこずを孊びたした。
ただし、ヘッダヌでそれらを宣蚀する必芁がありたす。そうすれば、実装がどこにあるかを簡単に理解できたす。

1぀のカテゎリでパブリックメ゜ッドずプラむベヌトメ゜ッドを定矩する必芁がある堎合がありたす。

次に、WYPopoverController.hにTableViewカテゎリを远加したす。
WYPopoverController_Private.hのカテゎリはTableView_Privateであり、実装ファむルはWYPopoverController + TableView.mになりたす。

プロゞェクトのクラスは次のようになりたす。


前の蚘事ぞのコメントで、 greenkaktusは「#pragma、#warning、// FIXME」の䜿甚方法を説明するよう提案したした。

特定の堎所で枊を無効にする必芁がある堎合にのみ#pragmaを䜿甚したす。
これが唯䞀の真の方法であるず確信しおいる堎合にのみ、私はそれを非垞に慎重に䜿甚したす。
#pragma markは䜿甚したせん。 私はプログラマヌを定芏で叩きたした。

#warningは䜿甚したせん。゚ラヌずしお扱われたす。 いく぀かの詳现は前回の蚘事にありたす。

将来の手がかりずしお「// TODO」を䜿甚したす。 たずえば、負荷の増加に䌎う最適化が必芁になる可胜性のあるボトルネックが芋られる堎合。
"// FIXME"修正が必芁な堎所で䜿甚したすが、少し埌です。

このコヌドの品質に぀いおはただ倚くのコメントがありたすが、このトピックは別の蚘事に倀したす。

次の蚘事では、APIを操䜜するために䜿甚するクラスのデバむスに぀いお説明する予定です。
できるだけ柔軟で自動化された蚭蚈を詊みたした。
そのため、apiメ゜ッドぞの新しい呌び出しの远加ず応答の解析は、数行で実行できたす。

提案やコメントは倧歓迎です。
最埌たで読んでくれおありがずう。

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


All Articles