2017-09-21 10 views
0

でオーディオを録音するために大きなserviceが見つかりました。 しかし、私は理解していない少なくとも一つのことがあります:TypeScript 2:オブジェクトではなくクラスの呼び出しメソッド

this.MediaPlugin.startRecord(); 

質問:たとえば

はライン25で、なぜそれがthis.MediaPlugin.startRecord()に呼び出し、this.mediaPluginは対象ではありませんthis.mediaPlugin.startRecord()どこんクラスMediaPlugin

クラスがthis.MediaPluginを使用してアクションを実行する場合、なぜgetメソッドのオブジェクトに戻りますか?

完全なコード:

import { Injectable } from '@angular/core'; 
import { MediaPlugin } from 'ionic-native'; 

export enum AudioRecorderState { 
    Ready, 
    Recording, 
    Recorded, 
    Playing 
} 

@Injectable() 
export class AudioRecorder { 
    mediaPlugin: MediaPlugin = null; 
    state: AudioRecorderState = AudioRecorderState.Ready; 

    get MediaPlugin(): MediaPlugin { 
    if (this.mediaPlugin == null) { 
     this.mediaPlugin = new MediaPlugin('../Library/NoCloud/recording.wav'); 
    } 

    return this.mediaPlugin; 
    } 

    startRecording() { 
    this.MediaPlugin.startRecord(); 
    this.state = AudioRecorderState.Recording; 
    } 

    stopRecording() { 
    this.MediaPlugin.stopRecord(); 
    this.state = AudioRecorderState.Recorded; 
    } 

    startPlayback() { 
    this.MediaPlugin.play(); 
    this.state = AudioRecorderState.Playing; 
    } 

    stopPlayback() { 
    this.MediaPlugin.stop(); 
    this.state = AudioRecorderState.Ready; 
    } 
} 

答えて

1

this.MediaPlugingetへの参照です。この構文を使用すると、最初の呼び出しでMediaPluginが構築されますが、次の呼び出しで構築されます。

(それだけでthis.mediaPluginをinitにAudioRecorderクラスのコンストラクタを使用する方が理にかなって、その後、別の場所this.mediaPluginを使用すると思いますので、このソリューションは、あまりにも私には少し奇妙なようです)以下のすべてのメソッドの

0

ファーストゲッターで、私はそれが怠惰な初期化でreadonlyプロパティを実装しようとしていると思います。

get MediaPlugin(): MediaPlugin { 
    if (this.mediaPlugin == null) { 
     this.mediaPlugin = new MediaPlugin('../Library/NoCloud/recording.wav'); 
    } 

    return this.mediaPlugin; 
} 

初めてthis.MediaPluginにアクセスしようとするので、MediaPluginの新しいインスタンスが作成されています。また、AudioRecorderをインスタンス化して、何らかの理由でそれを使用しないと、すぐにMediaPluginのインスタンスを作成しないメモリを節約するのに役立ちます。あなたが質問に答える

Lazy loading patternを参照してください):this.mediaPluginがオブジェクトである場合)

なぜそれが this.mediaPlugin.startRecord((this.MediaPlugin.startRecordを呼び出す)とせず、 MediaPluginはクラスですか?

Typescriptは遅延ロードの一般的なメカニズムを提供しておらず、実装する方法はゲッターメソッド(AudioRecorderクラスのように)でプライベートプロパティを作成することです。

this.MediaPlugin.startRecord()を呼び出すと、MediaPluginインスタンスの作成および操作ロジックをカプセル化することができます。

0

命名規則は

誰かが命名規則に関して台無し。プロパティの名前はではなくmediaPluginである必要があります。

プロパティアクセサーがMediaPluginと呼ばれる理由は、mediaPluginと呼ばれるバッキングフィールドが既に存在するためです。

バッキングフィールドは_mediaPluginとする必要があります。他の人は、これが命名規則に反すると主張するだろう。後者の場合はmediaPluginFieldとすることができます。

class AudioRecorder { 
    mediaPluginField: MediaPlugin = null; 

    get mediaPlugin(): MediaPlugin { 
    if (this.mediaPluginField === null) { 
     this.mediaPluginField = new MediaPlugin('../Library/NoCloud/recording.wav'); 
    } 

    return this.mediaPluginField; 
    } 
} 

依存性逆転

@Vladyslav Yefremovが指摘するようにしかし、間違いなくより良いオプションは、コンストラクタでMediaPlugin依存関係を注入またはサービスロケータのいくつかの種類からそれを引くことであろう。

class AudioRecorder { 
    constructor(private mediaPlugin: MediaPlugin) { } 
} 

または

class AudioRecorder { 
    private mediaPlugin: MediaPlugin; 

    constructor(mediaPlugin: MediaPlugin) { 
     this.mediaPlugin = mediaPlugin; 
    } 
} 

怠惰なインスタンス化

オーディオレコーダーは、すべてのアクションのためのメディアのプラグインを必要とするように私はすぐに、遅延したメディアプラグインをインスタンス化する必要性が表示されません。

しかし、メディアプラグインは、インスタンス化時にメディアファイルを読み込むという副作用があるためです。この場合、メディアプラグインプロパティは、実際に必要とされるまで、すなわちAudioRecorderが必要とされるまで、リソースのオープンを遅延させるために遅延的にインスタンス化されます。

関連する問題