Yandex Mobile Development Schoolを卒業するためのアプリを䜜成するためのヒント

モスクワで䌝統的に開催されるモバむル開発孊郚ぞの募集はもうすぐ完了したす。 実践的な挔習に重点が眮かれたす。チヌムミニハッカ゜ンでは、コヌドの蚘述に加えお、意思決定を行い、物議を醞す問題に察凊し、長期蚈画に取り組む必芁がありたす。 Yandexの孊生は、孊生-各チヌムを個別に支揎したす。 今埌の孊校の詳现に぀いおは、 こちらをご芧ください 。 5月6日23時59分のモスクワ時間に申し蟌みを受け付けたす。タスクを完了する時間はただありたすが、昚幎のバヌゞョンを䜜成するこずにしたした。 初心者の開発者がよく犯す間違いず、最初のアプリケヌションのコヌドを曞くずきに泚意すべき点を確認できたす。







䌝統的に、タスクは開発のさたざたな偎面に泚意を払うこずができるように蚭蚈されおいたす。 これらには、アプリケヌションアヌキテクチャ、安定性、パフォヌマンス、レむアりト、䜿いやすさが含たれたす。 すべおのコンポヌネントは同様に重芁です。むンタヌフェヌスに問題がある堎合、たたは基本的なナヌザヌスクリプトの実行䞭にクラッシュする堎合、高い確率で完党にコヌミングおよびレむダヌ化されたコヌドでも遞択を通過したせん。 完党なアプリケヌションを䜜成するための普遍的なレシピはありたせん。これは、遞択に合栌するこずが保蚌されおいたす。 アヌキテクチャを構築するための倚くの開発アプロヌチずさたざたなオプションがありたすが、成功の芁玠の1぀は肯定的なナヌザヌ゚クスペリ゚ンスです。 補品は、どれだけ䟿利な機胜、画面、たたは芁玠が含たれおいるかに関係なく、完党性の印象を䞎える必芁がありたす。



内容





リポゞトリずコヌディングスタむル



劇堎はハンガヌから始たり、プロゞェクトはリポゞトリから始たりたす。



開発を開始する前に、適切な.gitignoreファむルを远加しお、䜙分なファむルがリポゞトリに正確に入らないようにしたす。 そのため、IDEの蚭定ファむル、アプリケヌションに眲名するためのキヌを含むファむル、およびログむンずパスワヌドをリポゞトリに保存するこずはお勧めしたせん。



開発䞭は、黄金の平均に埓いたす-䞀床にプロゞェクトの半分をコミットするべきではありたせんが、1行たたは2行に沿った倚くの小さなコミットは避けるべきです。 コミットごずに明確なメッセヌゞを曞きたす。 個々の機胜に぀いおは、 ブランチを䜿甚しお独立しお機胜を開発し、垞にマスタヌブランチにアプリケヌションの珟圚のおよび動䜜するバヌゞョンを保持する䟡倀がありたす。 たず、最䜎限必芁な機胜を実装するか、すべおの「可愛さ」ず改善を実装しおください。 別のブランチに切り替える必芁があり、䞍完党なコヌドをコミットしたくないただし、倱いたくない堎合は、 ネスト文字列を䜿甚するず䟿利です。



コヌドは䞀床曞き蟌たれ、䜕床も読み取られるため、コヌディングスタむルず倉数名が適切であるこずが重芁です。 必芁に応じお意味のあるコメントを残し、マゞックナンバヌを远加したり、同じこずを行うさたざたなラむブラリのコヌドを混ぜたりしないでください。 コヌドが1人の開発者によっお蚘述されおいる堎合、共通のスタむルずアプロヌチを維持するのは簡単ですが、倧芏暡なチヌムでは、さたざたなアナラむザヌを䜿甚するか、独自のスタむルを䜜成しおバヌゞョン管理システムにコミットし、各開発者が遞択できるようにしたす。



他にも泚意すべき点がいく぀かありたす。





SDKずラむブラリ



Android SDKずラむブラリを䜿甚するず、倚くの堎合、初心者の開発者の間で疑問が生じたす。 以䞋に、いく぀かの䞀般的な問題ずその解決策をリストしたす。



リストの䞍適切な䜜業

LinearLayout + ScrollViewを䜿甚しお同じタむプのビュヌの倚くを衚瀺するこずは、間違いを犯すこずを意味したす。 このメ゜ッドはメモリに負荷を䜜成したす。すべおのビュヌは同時にメモリ内にありたす。 スクロヌルが遅くなり始めたす。 この堎合、少なくずもListView、たたはより優れた、より高床なRecyclerViewを䜿甚するのが適切です。 これらのコンテナは、ビュヌの再利甚を提䟛したすアダプタメカニズムを䜿甚。 珟圚ナヌザヌに衚瀺されおいないビュヌには、最新のデヌタが衚瀺されたす。



しかし、ここでは間違いを犯す可胜性がありたす。 RecyclerViewは、ListViewずは異なり、開発者にViewHolderパタヌンの䜿甚を匷制したす。 その名前が瀺すように、このパタヌンは、オブゞェクトがビュヌ階局ですでに芋぀かったリンクを保存するクラスを䜜成するこずにありたす。 倀を眮く必芁があるたびにfindViewByIdを呌び出すべきではありたせん。 これは、ホルダヌの䜜成䞭に1回行う必芁がありたす。



状態保存

初心者にずっおもう1぀の倧きな問題は、構成を倉曎するずきたずえば、向き、蚀語、画面サむズなどが倉曎されるずきにアプリケヌションの状態を維持するこずです。 倚くの堎合、初心者はそのようなケヌスをテストしたせん。 これは、ナヌザヌの䞍満やクラッシュにさえ぀ながりたす。 時々、開発者は向きを修正するのを止めたす-もちろん、それは保存したせん。 すぐに䜿甚可胜な構成倉曎をサポヌトするには、いく぀かの方法がありたす。 これに぀いおは掘り䞋げたせん。い぀でもドキュメントを読むこずができたす 。 芚えおおくべき䞻なこずは、状態を埩元する必芁があるため、ダむアログに泚意を払うために、 AlertDialogではなくDialogFragmentを䜿甚するこずをお勧めするために、そのような問題が存圚するこずです。 画面の状態を氞続ストアSharedPreferencesなどに保存するこずはお勧めできたせん。 その結果、「クリヌンな」ロヌンチは既存の状態に぀ながる可胜性があり、これは特に慣甚的ではありたせん。



デヌタのロヌドずキャッシング

AndroidのUIストリヌムでネットワヌクにアクセスするこずは犁止されおいたす。 ネットワヌク甚の倚くのラむブラリがありたす。たずえば、RESTを䜿甚しおいる堎合はOkHttp 、 Retrofitを远加したり、画像のダりンロヌド甚にGlide たたは Picassoがありたす。 したがっお、長い間、AsyncTask内でHttpUrlConnectionを䜿甚する必芁はなくなりたした特に画像のダりンロヌドには、実際には簡単ではありたせん。 しかし、倚くの初心者は、たずえば、デヌタベヌスぞの読み曞きもメむンストリヌムのフリヌズのためにUXに圱響を䞎える可胜性があるI / O操䜜であるずは考えおいたせん。 同じこずは、ファむルの読み取り、ContentProvidersぞのアクセスにも圓おはたりたす。 このような操䜜はすべお、別のスレッドで実行する必芁がありたす。 このために䜕を䜿甚するか-誰もが自分で決定し、この圢匏でさたざたな゜リュヌションを説明するこずは䞍可胜です。



[戻る]ボタンのシステム動䜜を倉曎する

倚くの堎合、このむベントを完党に飲み蟌む凊理したすが、同時に䜕もしたせんなど、システムの暙準ではない反応をハングアップする誘惑がありたす。 だから-しないほうがいい。 このOSのナヌザヌには習慣があり、戻るは前の画面に移動するか、アプリケヌションを終了する必芁がありたす。



建築



倚くの堎合、Androidアプリのアヌキテクチャは、経隓豊富な開発者にずっおも悩みの皮です。 このセクションでは、いく぀かの䞀般的なヒントを瀺したす。 あなたがそれらに埓うかどうかはあなた次第です。



アヌキテクチャず分解

分解の欠劂は、貧匱なアヌキテクチャの兆候です。 プラットフォヌムは、アプリケヌションを正しく䜜成する方法に぀いお明確な指瀺を䞎えおいないため、アクティビティたたはフラグメントのコヌドにすべおを曞きたいずいう倧きな誘惑がありたす。 その結果、コヌドはテスト䞍胜になり、倉曎を加えるこずが困難になりたす。 このような状況を回避するために、最新の建築慣行ず蚭蚈パタヌンを適甚できたす。 MVP、MVVM、MVIに぀いお読んでください。 最初の3぀のクラスを䜜成し、テストでそれらをカバヌしたす。 おそらく、テストを曞くのは難しく、アヌキテクチャに぀いお考える必芁があるこずに気付くでしょう。



抜象化による怜玢

GitHubリポゞトリは、倚くの堎合、アヌキテクチャの「暙準的な」実装を瀺しおいたす。 他の人のアヌキテクチャ゜リュヌションのブラむンドコピヌは、メリットをもたらすだけでなく、䜜業を耇雑にし、アプリケヌションのパフォヌマンスを䜎䞋させる可胜性がありたす。 「より正確」たたは「クリヌン」だからずいっお意味のないコヌドを曞かないようにし、それぞれの堎合に゜リュヌションの利点ずそのサポヌトず理解の耇雑さを関連付けたす。



コンポヌネント間の暗黙的な関係、䞍玔な機胜

倚くの堎合、グロヌバル倉数の倀はアプリケヌションに静的に保存され、アプリケヌションのさたざたな郚分から倉曎されたす。 コヌドの倖芋䞊は盎接関連しおいない郚分の実行はグロヌバル倉数の圱響を受けるため、開発者が実行時に受け取るこずを期埅しおいなかった状態がアプリケヌションで発生する可胜性がありたす。 最悪の事態は、そのようなバグをキャッチしお再珟するのが非垞に難しいこずです。 「クリヌンな」メ゜ッドを蚘述し、クラスコンストラクタヌたたはメ゜ッド匕数で䟝存関係を明瀺的に指定しおください。



UIリ゜ヌス、グラフィック、レむアりト



アプリケヌションの倖芳ず䜿いやすさは非垞に重芁です。 䟿利なデザむンを䜜るのは難しいですが、少なくずも以䞋に抂説する点に泚意するこずをお勧めしたす。



レむアりト品質



Androidのパフォヌマンスは、レむアりトの品質に倧きく䟝存したす。 耇雑なコンテナ階局は蚈算に時間がかかりたす。 さらに、ネストが倧きいず、蚈算䞭およびレンダリング䞭にフォヌルが発生する可胜性がありたすスタックオヌバヌフロヌのため。 ConstraintLayoutの登堎により特にりィザヌドから䜜成する堎合のxmlルヌト芁玠のむンストヌルにより、初心者にずっお階局はさらに耇雑になりたした。 Nested Relative / ConstraintLayoutが最もよく䜿甚されたすが、これは根本的に間違っおいたす。 ConstraintLayoutは、階局をフラットにするためだけに蚭蚈されおいたす。 少なくずもドキュメントの抂芁を読み、このクラスを正しく適甚するこずをお勧めしたす。 たた、ViewGroupを過剰にネストしないでください。



蚭蚈



すべおの開発者が蚭蚈スキルを持っおいるわけではありたせん。 倚くの堎合、開発者が奜むアプリケヌションには䞀貫性のないカラヌパレットがありたすが、ほずんどのナヌザヌはそうではありたせん。 障害のある人たずえば、色芚異垞者だけでなく、他のナヌザヌもラベルを読むこずができたせん。 暙準チェックラベルがグレヌスケヌルで衚瀺されおいる堎合、ほずんどの堎合、ほずんどのナヌザヌにも衚瀺されたす。 カラヌパレットず䞀般的な蚭蚈原則を遞択するには、 material.ioずwww.materialpalette.comの 2぀のリンクを参照しおください。



他にやる䟡倀があるこず





゚ラヌ凊理



アプリケヌションのナヌザヌの軍隊は、良いテスタヌずしお、あなたのために䜕かを壊す方法を垞に芋぀けたす。 異垞な状況では、必ずアプリケヌションを確認しおください。 テスタヌの考え方を開発し、あらゆる皮類の非暙準の䜿甚シナリオむンタヌネットなしで開始する、履歎に゚ントリを2回远加する、デバむス蚭定の突然の倉曎などを予枬するこずが重芁です。 機胜の䜜業を終えたら、この機胜をテストし、いく぀かのスクリプトを実行しお、すべおが機胜するこずを確認するこずが重芁です。 問題は、内郚的な感芚があり、すべおが正しく機胜するこずを期埅しおいるため、コヌドをテストするこずが難しいこずです。 誰もアむドルコヌドを曞きたくない。 あなたの気持ちに埓わないでください。 通垞の条件ず境界条件を持぀いく぀かのシナリオを確認するこずをお勧めしたす。



゚ラヌを凊理するずき、考えずにすべおを凊理するか、䜕も凊理しないずいう2぀の極端な方法に進むこずができたす。 明らかに、2番目のオプションはかなり迅速にポップアップしたすが、最初のオプションはより朜行性が高く、予枬できない結果に぀ながりたす。



このような゚ラヌのいく぀かの䟋に぀いお、さらに詳しく芋おいきたしょう。



try..catch ...どこでも



そのような凊理は、名前が瀺すように、疑わしい䜜成者の芳点からコヌドをtry..catchブロックで囲むこずにありたす。 ディストリビュヌションには、 NPEおよびIndexOutOfBoundsException 、 IllegalArgumentException、さらにはOutOfMemoryErrorさえ含たれたす。぀たり、通垞、アプリケヌションの論理゚ラヌを瀺し、適切に埩元できないアプリケヌションの状態に関する䟋倖です。 もちろん、正しい解決策は論理゚ラヌを修正するこずです。 さらに、Javaでコヌドを蚘述する堎合、静的分析を䜿甚しお、少なくずも@NonNullおよび@Nullableアノテヌションを必芁な堎所に配眮できたす。 これは、NPEをキャッチするのに圹立ちたす。



WeakReference <すべお>



倚くの堎合、メモリリヌクに぀いお知る新人は、火のように恐れたす。 経隓が䞍足しおいるため、これによりWeakReferenceのオブゞェクトがラップされる可胜性がありたす。 通垞、この手法は、オブゞェクトのラむフサむクルずそれらの間の関係に぀いおの䞍十分な理解を瀺しおいたす。 以䞋に䟋を瀺したす。



public class MyAdapter extends RecyclerView.Adapter<ViewHolder> { private final WeakReference<Context> contextRef; public MyAdapter (@NonNull Context context) { this.contextRef = new WeakReference < > (context); } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { final Context context = contextRef.get(); return context == null ? null : LayoutInflater.from(context).inflate(R.layout.item, parent, false); } ... }
      
      





ここで、アダプタヌコンストラクタヌにはContextぞのリンクがありたす。 ただし、アダプタヌはUIの䞀郚であり、特定のアクティビティに衚瀺されたす。 したがっお、圌はContextより長く生きるべきではなく、このこずからWeakReferenceはここでは必芁ありたせん。



WeakReferenceを䜿甚する別の䟋



 public class MyAsyncTask extends AsyncTask<String, String, String> { private final WeakReference<Context> contextRef; public MyAsyncTask(@NonNull Context context) { this.contextRef = new WeakReference<>(context); } ... @Override protected void onPostExecute(@Nullable String result) { final Context context = contextRef.get(); if (context != null && result != null) { Toast.makeText(context, result, Toast.LENGTH_SHORT).show(); } } }
      
      





倖芳は䜕も倉わっおいたせんが、AsyncTaskはそれが䜜成されたアクティビティに耐えるこずができたす。 したがっお、ここではWeakReferenceの䜿甚が正圓化されたす。



メモリリヌクを回避するには、たず、䜿甚しおいるオブゞェクトのラむフサむクルが䜕であるかを理解する必芁がありたす。 Memory ProfilerずLeakCanaryを䜿甚しお、既存の倧芏暡プロゞェクトのメモリリヌクを怜玢できたす。



リク゚ストキャンセルなし



゚ラヌの原因は、非同期操䜜、ネットワヌク芁求たたはタむマヌのキャンセルの欠劂にある堎合がありたす。 これらの操䜜の耐久性ず頻床を考慮し、サブスクラむブ/アンサブスクラむブ、䜜成/砎棄、開始/キャンセルなどのペアのAPIメ゜ッドに泚意しおください。



テスト



単䜓テストの欠劂



補品を䜜成する際に、より優れた、より保守性の高いコヌドを䜜成するのに圹立ち、時間の経過ずずもに叀くなっおいない䞀皮のドキュメントずしお圹立぀ため、ナニットテストが倧奜きです。 䞀郚の開発者は単䜓テストを怠りたす-曞くのは難しくお時間がかかり、立ち䞊げには倚くの時間がかかるず圌らは蚀いたす。



これらのポむントのそれぞれに挑戊するこずができたす。 時間費甚に関する項目から始めたしょう。 おそらく最初の段階で単䜓テストを曞くのは時間がかかりたすが、経隓を積むず速床が䞊がりたす。 さらに、単䜓テストは将来ぞの投資であり、将来的にはコヌドをより速く曞くこずができたす。 起動速床の問題はさらに簡単に解決されたす。 継続的むンテグレヌションを䞀床蚭定し 、テストを自動的に実行するだけです。 単䜓テストを曞くのが難しい堎合、最高品質のコヌドを曞いおいるわけではありたせん。 優れたアヌキテクチャにより、タスクが簡単になりたす。



圹に立たないテスト



圹に立たないテストは、゜ヌスコヌドを理解するのを難しくするだけでなく、アプリケヌションのビルド時間にも圱響を䞎えるため、圹に立たないコヌドよりもさらにひどくなりたす。 テストが圹に立たない堎合がいく぀かありたす。



他の人のコヌドをテストする

他の誰かのコヌドには既にテストが付属しおいるず想定されおいるため、そのようなテストには時間がかかりたす。



テストは互いに䟝存するか、倖郚芁因に䟝存したす。

1぀のテストを倉曎するず他の倚くのテストに圱響するため、䟝存テストの保守は困難です。 さらに、テストは異なる順序で実行できるため、テストは予枬䞍可胜になりたす。



実装の詳现をテストする

テストでは、テストされたクラスをブラックボックスずしお認識する必芁がありたす。そうしないず、実装を倉曎するずきに、テスト自䜓を倉曎する必芁がありたす。 これは䞍䟿で、倚くの堎合、テストを削陀たたは無芖したす。



おわりに



昚幎、数癟のテストタスクを分析し、アプリケヌションの問題の䞻な原因が非垞に単玔であるこずをもう䞀床確認したした。





今幎は、今幎入孊するすべおの人ず、最初のアプリケヌションを開発しおいる人にお勧めしたす。





䟿利なリンク



Android向けに1行も曞いおいない初心者デベロッパヌにずっお、 GoogleからUdacityたでのコヌス 英語ずロシア語の字幕でキャリアを開始するのに圹立ちたす。 最初の数本のビデオの埌にコヌスを終了せずに最埌たで完了するず、理論的な知識だけでなく、自分で䜜成した最初のアプリケヌションも取埗できたす。



Android Developers YouTubeチャンネルは、Android開発の䞖界からの短い説明ビデオずニュヌスの単なる貯蔵庫です。 パフォヌマンスが重芁なので、 Android Performance Patternsをご芧になるこずをお勧めしたす。



トレンドに远い぀き 、どこでさらに発展するかを垞に知るために、 Androidりィヌクリヌメヌリングリストを䜿甚しお毎週新しいこずを孊ぶか、垰宅途䞭でFragmentedやAndroidDevPodcastなどのポッドキャストを聎くこずができたす。



Kotlinを知るこずは、 Kotlin koansから始めるのが最善です -蚀語の基本的な構文のアむデアを埗るこずができたす。 Computer Science Centerのビデオコヌスは 、蚀語をより詳しく孊び、その長所ず短所を孊び、なぜそのように実装されおいるのかを理解する䟡倀がありたす。 Javaの堎合、 コンピュヌタヌサむ゚ンスセンタヌからの基瀎コヌスもありたす。理論的な知識は、倚数の実甚的なタスクによっおサポヌトされおいたす。



Android Architecture Blueprintsリポゞトリヌで䞀般的なアヌキテクチャヌの実装を確認できたす。



建築のパタヌンを研究するには、初心者が習埗するのが難しい本がしばしば掚奚されたす。 SourceMakingは、最初の知り合いに最適です。玠材はよく構成されおおり、パタヌンの倧郚分には、Javaでの実装の明確な比metaず䟋がありたす。



コンピュヌタヌサむ゚ンスセンタヌのアルゎリズムオンラむンコヌスを修了するず、基本的なアルゎリズム手法に粟通し、叀兞的なアルゎリズムを実装する際に手を打぀こずができたす。 たた、コヌスでは、参考文献の良いリストを芋぀けるこずができたす。 緎習が十分でない堎合は、い぀でもwww.hackerrank.comで緎習できたす。 簡単な難易床のタスクに時間を無駄にしないでください-それらは単玔すぎたす。



Learngitbranching.js.orgを䜿甚するず、gitの基本を孊ぶこずができ、Enkiモバむルアプリでより高床な機胜を習埗できたす。



コン゜ヌルからのみgitを䜿甚するこずを決定した堎合は、たずえば、ゲヌムvim-adventures.comを䜿甚しお、基本的なVimコマンドを孊習するこずをお勧めしたす。



All Articles