PCL
Xamarin

Xamarinでネイティブ依存処理付きPCL作る際、ちょっとだけ楽になる?方法

More than 1 year has passed since last update.

いやあ、Xamarin無料なりましたねー。
いつか来るとは思ってたとはいえ、本当に実現してみると感慨もひとしおです。
私の場合仕事じゃなくて趣味開発なので、お小遣いの事を考えなくていいというのがやっぱり超うれしい(発想が小さすぎる)。
この勢いでどんどん広まるといいなあ...。

先日のJXUGでも話題に上がったネイティブ依存コード使えるPCLの作り方、Fenrirさんのブログにも詳細上がってたので今朝から試してみてたのですが、プラットフォームで実装分けるところ別々に書けるのはいいけど実装一緒のところをCoreに書けなくて(Coreは単なるスタブなので)、共有しようとするとSharedプロジェクト作ってiOS/Android両プロジェクトに組み込まないといけないのがちょっと面倒な感じかなと...。
一つのPCL作るのに、Core、iOS、Android、Sharedと4つのプロジェクト作らないといけないので。

あと、大きなクラスだと、Coreのスタブと依存プロジェクトの実実装のインタフェース一致を維持するのも結構しんどいかなと。
きっちり先に設計して作る形だといいですが、趣味で書き散らかす感じだと特に。

それで思ったんですが、共通処理書くのにどうせSharedプロジェクトがいるのなら、全部の処理Sharedに書いて、Coreのスタブ実装でもShared共有してやって、コンテキストスイッチで処理置き換えてやれば楽になるんじゃないか?とか思いました。
スタブでも実実装でも同じクラスファイル読み込む形になるので、インタフェースがズレることがありえなくなる。

ソリューション内の構成としては、

  • Project.Core
  • Project.iOS
  • Project.Android
  • Project.Shared

のような感じで、クラスは全部Sharedに配置して、Core、iOS、Android全てからSharedを参照してやる。
その上で、Sharedのクラス内では、

Sample.cs
namespace Project
{
    public class Sample
    {
        public string GetPlatform()
        {
#if __IOS__
            return "iOS";
#elif __ANDROID__
            return "Android";
#else
            throw new Exception("Not implemented GetPlatfom method");
#endif
        }
    }
}

みたいな感じにしたら超楽じゃないかな?と…。

サンプル作って動くかどうか試してみましたけど、一応問題なく動くようです。

コンテキストスイッチ使うので好き嫌い分かれるかもしれませんが、個人的には一貫性保つのにあちこち直すより1つにまとめておく方が楽かなあと思うので、同じ感覚の人にとっては楽になるかも。
多人数で開発するような場合には、先にしっかり仕様固めると思うので、一人開発向けに。