遅延読み込み(Lazy Loading)と遅延初期化(Lazy Initialization)

Wikipedia 遅延読み込みによると以下の意味らしい。

遅延読み込み(ちえんよみこみ、英語: Lazy loading)とは実際にオブジェクトが  
必要とされたときに後から初期化を行うソフトウェアデザインパターンの一つである。

遅延読み込みだけでもデザインパターンが複数あるらしい、
今回は遅延初期化(英語: lazy initialization)のみまとめる。

MARTINFOWLER.COM LazyInitializationを参考して特徴をまとめる。

  • Lazy initializationは最適化するためのテクニックである。
  • 遅延させることで初期化を早くし、利用者が望むタイミングで初期化処理を開始できるようになる。
  • あくまでもパフォーマンス改善のテクニックなので問題がない限りLazy initializationは使わないほうがよい
  • このテクニックを利用するとデバッグに苦労する
    • 初期化が遅延されるため、システム上で存在するはずのない状態が一時的に生まれるだからだそう

このデザインパターンは最終手段的なものなのかなと思う。
むやみやたらに使うものではないことはわかった。

C#だと.NET4.0以降は遅延初期化を実現するLazyとLazyInitializerというのがあるらしい [C#] 遅延初期化を実現する3つのパターンと2つのクラス、Singletonパターンに特化した2つの方法

C# structとobjectをマッピングする

C#からC言語で記述されたDLLを呼び出す機会が少なからずある。
その時に必ずstruct定義を引数としてデータ設定・取得を行う。

組み込み系だと1バイトのビットフィールドに情報を詰め込むことがあり、 これをそのままアプリケーション側に渡すと使いづらいし面倒だしやっかいになる。
なのでDLLから取得した時点でobjectにマッピングし、アプリケーション側で使いまわしやすくしてやる。

struct MainteStruct
{
    public byte status1;
    public byte status2;
    public byte status3;
}

class MainteObject
{
    bool error1;
    bool error2;
    bool error3;
    bool error4;

    public MainteObject(MainteStruct mainteStruct)
    {
        error1 = ((mainteStruct.status1 & 0x01) == 0x01) ? (true) : (false);
        error2 = ((mainteStruct.status1 & 0x02) == 0x02) ? (true) : (false);
        error3 = ((mainteStruct.status1 & 0x04) == 0x04) ? (true) : (false);
        error4 = ((mainteStruct.status1 & 0x08) == 0x08) ? (true) : (false);
    }
}

C# InvokeとBeginInvokeの違いは?

はじめに

WPFアプリ作成中にBeginInvokeとInvokeを使い分ける必要があったのでメモる。

 

Dispatcher.BeginInvoke

スレッドでデリゲートを非同期的に実行、 Dispatcher に関連付けられています。

Dipatcher.Invoke

指定したデリゲートをスレッドで同期的に実行、 Dispatcher に関連付けられています。

まとめ

とくにBeginInvokeは非同期のためRace Conditionなど引き起こす可能性があるので注意して使う。バックグラウンドで状態監視してUIを制御するときにBeginInvokeやInvokeを使うことも多いが、処理によってはBeginInvokeを使うと複数回呼ばれてしまうこともあるので注意が必要そう。

 

C# Visibilityとは

Visibilityを制御する必要があるUIを作成した際に調べたのでメモる。

Visibility列挙型

Collapsed

要素を表示しない、レイアウトの領域も確保しない

Hidden

要素を表示しない、レイアウトの領域を確保する

Visible

要素を表示する、レイアウトの領域を確保する

まとめ

実際に表示してみると以下のような感じになる

<Window x:Class=\"WpfNavigationService.View.Window\"
        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"
        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"
        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"
        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"
        xmlns:local=\"clr-namespace:WpfNavigationService.View\"
        mc:Ignorable=\"d\"
        Title=\"Window\" Height=\"200\" Width=\"200\">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width=\"1*\"/>
            <ColumnDefinition Width=\"1*\"/>
        </Grid.ColumnDefinitions>
        <StackPanel Background=\"White\" Grid.Column=\"0\" Grid.ColumnSpan=\"1\">
            <TextBlock Text=\"Visibility\" Visibility=\"Visible\" Background=\"Red\" Foreground=\"White\"/>
            <TextBlock Text=\"Collapsed\" Visibility=\"Visible\" Background=\"Green\" Foreground=\"White\"/>
            <TextBlock Text=\"Hidden\" Visibility=\"Visible\" Background=\"Blue\" Foreground=\"White\"/>
            <TextBlock Text=\"Visibility\" Visibility=\"Visible\" Background=\"Red\" Foreground=\"White\"/>
        </StackPanel>
        <StackPanel Background=\"White\" Grid.Column=\"1\" Grid.ColumnSpan=\"1\">
            <TextBlock Text=\"Visibility\" Visibility=\"Visible\" Background=\"Red\" Foreground=\"White\"/>
            <TextBlock Text=\"Collapsed\" Visibility=\"Collapsed\" Background=\"Green\" Foreground=\"White\"/>
            <TextBlock Text=\"Hidden\" Visibility=\"Hidden\" Background=\"Blue\" Foreground=\"White\"/>
            <TextBlock Text=\"Visibility\" Visibility=\"Visible\" Background=\"Red\" Foreground=\"White\"/>
        </StackPanel>
    </Grid>
</Window> 

f:id:kaleidot725:20170423202810p:plain