JingdongAPPキャッシャーのKotlinizationプラクティス

モバイルアプリを4つのカテゴリに分類します

  • React / Flutterアプリ

  • Webアプリ(純粋なWebページ)

  • ネイティブアプリ(純粋なネイティブアプリ)

  • ハイブリッドアプリ

oマルチビューハイブリッド:ネイティブビューとWebビューが交互に表示されるシーン

oシングルビューハイブリッド:同じビューに、ネイティブビューとWebビューの両方が含まれます

o Webベース:モバイルアプリケーションの本体はWebViewです

以前は、キャッシュレジスタモジュールは、H5キャッシュレジスタと呼ばれるシングルビューハイブリッドタイプを使用していました。H5レジは、iOSとAndroidの両方に共通する、高速で1回限りの開発です。開発の利便性を楽しみながら長期使用の過程で、

  • H5レジの最初の画面の読み込み時間は長く、ほとんどの場合1秒以上です。

  • ポップアップアニメーションは鈍く、ユーザーエクスペリエンスは十分に友好的ではありません。

  • テクノロジスタックリンクが長すぎます。JDWebViewコンテナ、H5フロントエンドページ、ネイティブページとJDWebView統合コントロールの相互作用、ネイティブとH5ページの相互作用、問題の特定とトラブルシューティングに比較的長い時間がかかります。

  • ゲームのWebページなど、電話のメモリを大量に消費するページからレジにジャンプする場合、構成が低い電話では、画面が黒または白になる問題が発生する可能性が高くなります。

ボトルネックはWebViewです。上記の理解を踏まえ、比較的安定したレジカウンターのホームページからWebViewを削除し、純粋なネイティブページに変更する必要があります。変換後のアーキテクチャ図:

ネイティブトランスフォーメーションの過程で、Javaを使い続けるか、Kotlinを選択するかという選択に直面します。キャッシャーチームは、KotlinがAndroid開発の未来であると信じています。Googleの完全なサポートと将来の豊富な言語エコロジーは、私たちに理由を与えてくれます。 Kotlinはモバイル側で大きく強力であると信じています。明るい見通しです。

次に、KotlinとKotlinの実践について説明します。この記事は、次の2つの部分から拡張されます。

  • Kotlinの理解

  • レジでのKotlinの特定のプラクティス

プログラミング言語の時間と空間のビュー

Kotlinを包括的かつ深く理解したい場合は、言語のソースから始めて、それをたどって、最後まで探索する必要があります。過去100年間で、プログラミング言語は、機械語、アセンブリ言語、高級言語の3つの段階を経てきました。Kotlinは高級言語です。高級言語の段階から、プログラミング言語の開発を見てみましょう。

摘自:最も人気のあるプログラミング言語1965-2019 by youtube

上の写真は、最も人気のある高級言語の変更プロセスを示しています。1950年代から1983年にかけて、高級言語はインキュベーションの初期段階でした。時系列で、プロセス指向の構造化設計、オブジェクト指向の分析と設計、関数型プログラミングのパラダイムなどが開発されました。言語の発達に伴い、一般的に使用される「オブジェクト指向」と「関数型」の境界はますます曖昧になっています。Kotlinは2011年にリリースされ、2017年にAndroid開発言語としてGoogleによって正式にサポートされました。

時間軸上でのKotlinの位置を見つけましたが、Kotlinと他の言語の水平方向の比較はどこにありますか?

実行時に暗黙的な変数型変換が許可されるかどうかに応じて、言語は強い型と弱い型に分けられます。Kotlinは強く型付けされた言語です(暗黙の型変換:ユーザーの介入は不要で、型変換の動作はコンパイラーによってプライベートに実行されます)

タイプの検出時間がコンパイル期間であるか実行期間であるかに応じて、言語は静的言語と動的言語に分けられます。Kotlinは静的言語です。

プログラムのソースファイルを実行する前に事前に機械語に変換する必要があるかどうかに応じて、言語はコンパイル済み言語とインタプリタ言語に分けられます。KotlinはJavaに似ており、バイトコード解釈言語にコンパイルする必要があります。

次の図に示すように、ダイナミクスと型強度に基づいて直交座標系を確立できます。X軸の正の方向に沿って、静的性はますます強くなり、Y軸の正の方向に沿って、型強度は次のようになります。どんどん強くなります。

ウェブから取得

時間が経つにつれて、動的言語は静的機能を追加し、静的言語は動的機能を追加しました。静的と動的は互いに近づいています。将来のプログラミング言語は、2つのハイブリッドです。JVM言語として、Kotlinは第1象限に分類され、Javaよりもダイナミクスが強く、Javaよりも型の強度が弱くなります。

概要:

したがって、Kotlinの基本的な理解があります。Kotlinは、最新のコンパイル済み、強く型付けされた静的言語です。Javaと比較して、Kotlinはより動的であり、プログラミング言語開発のトレンドに準拠しています。上記のKotlin機能は、最終的に言語機能を介して実装されます。

Kotlinの言語機能

言語機能は、一般機能、プロセス指向機能、オブジェクト指向機能、および機能機能に分けられます。

次のような一般的な機能:

  • 変数

  • 範囲

次のようなプロセス指向の機能:

  • フロー制御:条件ステートメント、分岐ステートメント、ループステートメント

  • 基本データ型

  • データコンテナ(配列とコレクション)

  • メソッドの定義と呼び出し

  • アクセス許可

次のようなオブジェクト指向機能:

  • クラスとクラス階層

  • オブジェクトとタイプ

  • カプセル化、継承、ポリモーフィズム、抽象化

  • インターフェイスと抽象メソッド

  • 混入します

  • 同時

  • 例外処理

  • ガベージコレクション

  • 再帰

次のような機能機能:

  • 参照透過性

  • 高階関数

  • ラムダ式

  • パターンマッチング

  • モナド構造

  • カリー化

  • 不変性と変動性

  • 閉鎖

KoltinとJavaの言語機能の違い

Kotlinの独自の機能には、データクラス、封印されたクラス、破棄、インフィックス式、アクセススコープ、演算子のオーバーロード、マスタースレーブコンストラクター、内部クラス/ネストされたクラス、プロパティアクセサー(組み込みのセッターおよびゲッターメソッド)、プロパティ遅延の初期化、タイプが含まれます。継承システム。次のように:

  • 型継承システムを増やす

  • デフォルトパラメータ、可変パラメータを増やす

  • 強化された不変性

  • 強化された航空安全

  • 強化されたジェネリック

  • 強化された関数/ラムダ式

  • 検出可能な例外

  • 演算子のオーバーロードを追加しました

  • 変更されたアクセススコープ

  • ベストプラクティスを文法に組み込む

KotlinとJavaの間にはまだ多くの違いがあることがわかります。ここに、機能とタイプの2つの側面があります。

機能的

KotlinとJavaの大きな機能の違いの1つは、機能サポートが大幅に改善されていることです。関数方程式の基本的な要素は次のとおりです。

  • 不変性

  • 参照透過性

  • 副作用なし

  • 高階関数とラムダ式

  • モナド構造

  • カリー化

  • パターンマッチング

  • インテリジェント型推論

  • 再帰

  • 並行性の安全性

関数型プログラミングには次の方程式があります。

画像

プログラム=可変プログラム+不変プログラム

可変性プログラム=オブジェクト+依存関係

不変プログラム=純粋関数+組み合わせ(モナド構造)

Kotlinの言語機能はこれをサポートしています。Javaと比較して、Kotlinはコンポーネント化と応答性においてより簡潔で直感的です。

タイプの違い

Kotlin型とJava型の違いには、型宣言の違いと型システムの違いが含まれます。

型宣言の違い

val a: String = "I am Kotlin"

これにより、関数定義の戻り値の型、クラスの継承、およびインターフェイスの実装で一貫した書き込みエクスペリエンスが提供されます。

fun sum(x: Int, y: Int): Int {

Javaは型の前に書かれ、戻り値の型はメソッドを定義するときに前に書かれますが、継承と実装は後ろにあります。タイプのポストポジショニングの利点:タイプの派生によってタイプが省略された場合に一貫した書き込みエクスペリエンスを実現します。Kotlinは3つのシーンで同じ記号と書き込みを実現します(タイプの派生)

型システムの違い

次の図は、Kotlin型システムを示しています。Kotlinは、基本的なデータ型をオブジェクト型に統合し、オブジェクト指向の継承システムを形成します。

*

Kotlinの欠陥

Kotlinの言語機能は豊富で強力であるため、Javaとは機能が異なります。すべてに長所と短所があり、Kotlinも例外ではありません。

1)ネストして多次元配列を作成する必要があります

val bytes = Array(3) { ByteArray(4) }

Javaを比較する

byte[][] bytes = new byte[3][4];

Kotlinと比較して、Javaははるかにクリーンでシンプルです

2)Kotlinが実装できないインターフェース

そのようなJavaインターフェース

interface Itest{

このインターフェースをKotlinに実装すると、クラスAは2つの同一の署名メソッドを実装するため、エラーを報告します。

class A : Itest{

3)放棄されたチェック済み例外(チェック済み例外)

これは物議を醸す欠陥であり、欠点と利点の両方があります。

**デメリット:**例外の必須の処理はありません。特にハードウェアやネットワーク関連のメソッドに関しては、一部のメソッドが呼び出されることがあります。スローされる可能性のある例外が常にわかっているとは限らない場合や、例外がスローされるかどうかがまったくわからない場合がよくあります。一部の例外処理が見落とされるか、この領域で例外処理が行われず、いくつかの潜在的な問題が埋もれます。

**利点:** Kotlinはチェックされた例外を区別しません。これにより、コードの記述が簡素化され、Kotlinの一貫した簡潔な設計哲学に準拠します。したがって、Kotlinには異常は検出されていません。

レジでのKotlinの特定のプラクティス

Kotlin言語の機能は、プロセス指向機能、オブジェクト指向機能、および機能機能の合計の一部です。バージョンV9.2.2から、AndroidキャッシュレジスタモジュールはKotlin言語を全面的に使用し始めました。安定性のために、JavaとKotlinの混合開発モデルを採用しました。

01Javaとの相互運用性

KotlinとJavaの相互運用性を見てみましょう。

1)KotlinがJavaコードを呼び出す

これは、JavaでJavaコードを呼び出すのとほとんど同じですが、次のようないくつかの違いがあります。

1.属性プレフィックス

回路図コード:

public final class User {

2.プラットフォームタイプ

Javaコードを呼び出した後にkotlinによって返されるタイプは、Kotlin側ではプラットフォームタイプと呼ばれます。プラットフォームタイプは、null許容型またはnull許容型として扱うことができます。つまり、Kotlinがコンパイルされると、プラットフォームタイプはnull以外のタイプと見なされ、正常にコンパイルするためにnull以外の判断を必要とせず、実行時にnull可能タイプと見なされます。プラットフォームタイプは、nullポインタ例外をトリガーする場合があります。キャッシュレジスターの空のセキュリティプラクティスは、この種のnullポインターを回避します。詳細については、次のコンテンツを参照してください。

2)JavaがKotlinコードを呼び出す

Kotlinアノテーションをkotlinコードに追加して、JavaがKotlinを呼び出すようにJavaがJavaコードを呼び出すようにします。

1)@JvmOverloadsのデフォルトのパラメーターのオーバーロード

@JvmOverloads

デフォルトのパラメーターオーバーロードアノテーションの導入後、レジ係による下部支払いコピーのコンテンツの更新を満たすために必要なメソッド定義は1つだけであり、メソッド定義のテンプレートコードが削減されます。

2)@JvmStatic static

object Updater {

キャッシュレジスターは、Java言語とKotlin言語の混合開発です。このアノテーションにより、Kotlinによって記述されたofメソッドを呼び出す元のJavaコードは、Updater.ofとして知られるものになります。

3)インターフェースレベルでは、JavaはKotlinインターフェースを使用して通過します。

Javaインターフェース<—> Kotlinインターフェース<—> Kotlinラムダ式

block: () -> ArrayList<Entity>

キャッシュレジスタのkotlin側で定義されたラムダ式は、Javaによって呼び出されたときにJava関数シリーズインターフェイスとして認識されます。

02レジでの空のセキュリティ慣行

ネイティブキャッシュレジスタプロジェクト自体のコードでは、これまでnullポインタのクラッシュは発生していません。ヌルポインタは客観的に存在しますが、レジはどのようにしてヌルポインタを回避しますか?Kotlinの助けを借りて、作業には主に2つの側面があります。

1. Kotlinのnull許容型とnullセーフコール機能により、null以外の判断をアップストリームインターフェイスデータレイヤーに分類し、統合された集中処理を実現します

回路図コードは次のとおりです。

public class Response extends BaseEntity implements ICheckNull {

各インターフェイスから返されるエンティティクラスについて、ICheckNullインターフェイスを実装し、エンティティクラスの各オブジェクトがnullかどうかを確認します。nullの場合は、このオブジェクトを追加で初期化します。このロジックのセットは、ジェネリックスの助けを借りてレジのツールクラスにカプセル化され、他のエンティティクラスの再利用を容易にします。

2. Kotlinのプラットフォームタイプはnullポインター例外を引き起こす可能性があります。したがって、KotlinがJavaを呼び出すコードによって返されるタイプは、null可能タイプとして扱われます。つまり、null以外の判断が行われます。Javaコードの戻り値がnull以外であることが保証されていない限り

Java側の回路図コード

   public PayEntity createPayEntity(Payment payment) {

KotlinがJavaを呼び出す

val payEntity: PayEntity? = Manager.getInstance().createPayEntity(payment)

Kotlin言語機能の使用に加えて、空気の安全性がさらに向上しました。具体的には、不変性、属性の読み取りと書き込みの分離、およびエルビス演算子によって実現されます。

1)可変で不変

variable = var ; value = val(final)

2)属性の読み取り操作と書き込み操作を分離します

Javaのsetterメソッドとgetterメソッドがプロパティに組み込まれているため、読み取り操作と書き込み操作の分離が容易になり、柔軟性があります。

回路図コード

var age: Int = 0

3)空の安全な通話とエルビスの操作

Kotlin言語レベルは、空の判断の便利な表現を提供し、空のネストを判断するための多数のifステートメントを介してJavaコードを記述する状況を回避します。

val currentPlan: String? = defaultCard?.recommendId ?: DEFAULT_PLAN

03問題が発生しました

  • デシリアライズ:fastjsonフレームワークがKotlinで定義されたInt、Float、およびDoubleタイプをデシリアライズすると、Javaの基本データ型値ではなくnullになり、元のフィールド型が文字列型に置き換えられます。

  • プラットフォームのコンパイルに失敗しました:中間変数を追加し、表現を変更することで解決しました。

  • 欠落している例外処理:NumberFormatExceptionがクラッシュします

NumberFormatExceptionのクラッシュログは次のとおりです。

画像

—java.lang.NumberFormatException:空の文字列sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1842)sun.misc.FloatingDecimal.parseFloat(FloatingDecimal.java:122)java.lang.Float.parseFloat(Float.java:451 )

問題はparseFloat(Float.java:451)メソッドにあります。toFloatのKotlin実装を見てください。

@kotlin.internal.InlineOnly

KotlinのtoFloatメソッドは、内部でJavaのparseFloatメソッドを呼び出します。JavaのparseFloatソースコードは次のとおりです。

    /**

ソースコードから、parseFloatメソッドがNullPointerExceptionとNumberFormatExceptionをスローすることがわかり、NumberFormatException例外処理が省略され、空の文字列が渡されました。したがって、自分で作成していないメソッドを呼び出すときにスローされる可能性のある例外に注意してください。

概要

プログラミング言語の歴史を見ると、Kotlinは、多言語プログラミングパラダイムの開発トレンドに準拠した、最新のコンパイル済みの強く型付けされた静的言語です。言語機能はJavaよりも機能的であり、一部のJavaプログラミングのベストプラクティスは言語機能に組み込まれています。

レジネイティブのプログラミング言語の選択は、運用効率と開発効率の間のトレードオフに基づいています。Kotlinはツールであり、ツールを正しく使用することで、レジのビジネスロジックをより適切に表現できます。Kotlinを使用するプロセスは、過去のJavaプログラミングの考え方を進化させたものであり、Kotlinによってもたらされる追加のメリットです。

Kotlinでのレジの立ち上げ時に、ヌルポインターの異常を排除しました。これまでのところ、レジ自体のビジネスコードにはヌルポインターの異常はありません。Kotlinのネイティブ変換後、読み込みを完了するためにホームページに入るのにかかる時間は、元のH5レジでの約1180msから現在は約360msに変更されました。レンダリング時間は820ms短縮され、最初の画面の読み込み時間は69.5%短縮されました。

共有することを学ぶ

情報共有の現在の時代では、あなたが正しい方法を見つけるか見つけるかどうかに応じて、インターネット上で多くのリソースを見つけることができます。

多くの友人は情報がないわけではなく、ほとんどの友人は数十または数百のGを持っていますが、彼らは散らかっていて、それらを見る方法を知らないか、読んだ後にそれらを忘れさえします。

インターネットで見つけた情報が非常に乱雑で断片化されていると感じた場合は、それらのセットを共有します。より体系的で、通常は自分でよく調べます。

2020年の実際の面接の質問の最新の数万ページ

NDKモジュール開発、Androidフレームワークアーキテクチャなど、7つのモジュールの学習教材...

体系的で方向性のある学習だけが、一定期間内に自分のテクノロジーを迅速に改善することができます。

このシステムスタディノートは、群衆に適しています。
**まず、**学習知識は比較的断片化されており、合理的な学習ルートと高度な方向性はありません。
**第二に、**数年間の開発、私はさらに前進する方法がわからず、私は混乱しています。
第三に、適切な年齢で、将来、管理を開発、変革、または強化する方法がわかりません。あなたがそれを必要とするならば、私はたまたまそれを受け取るために来ない理由があります!多分それはあなたの現在の状態を変えることができます!
記事のコンテンツが比較的大きいため、記事の長さは許可されておらず、表示されていないコンテンツの一部はスクリーンショットの形式で表示されます。完全なドキュメントを入手する必要がある場合は、私のGitHubをクリックして無料で入手してください

おすすめ

転載: blog.csdn.net/weixin_43901866/article/details/113922115