今の俺のC#

こういうタイトルでブログ始めちゃった以上、月刊誌になろうと毎日書こうとC#ネタを書かないわけにはいかないよね?

ちょっとだけ前置きを書く。

自分が全力で書いたコードを他人(≒後輩)が読めるか、メンテナンス出来るか?という心配が初めて頭をよぎったのはC++で template って言語仕様が出たときのような気がする。
当然今から10年以上前の話やけど、その後システム開発の会社に転職して、パッケージアプリケーション開発しながらシステム屋さんの業務アプリケーション開発における狭義のプログラミングを見た時、システム開発のプロジェクトチームの中で自分が全力でコードを書くことは2度と無いなと確信したし、その後はなるべく平易なロジックかつ直観的なコード・・・言い換えると、可読性の高いコード/理解容易性の高いコード・・・を実行時パフォーマンスと保守性を少し犠牲にしてプロジェクトでは書いてた。(過去形)

そういう戦場で戦ってるとウェブアプリケーションのUIが進化してきて、JavaScriptガリガリ頑張るとかすると必ず向き合わないといけないラムダ式クロージャの問題を現実的に後輩に教えて理解させるべきか、完全にあきらめてC言語ライク(Javaライク)ななんちゃってJavaScriptで妥協するかは長い間悩んだ。(過去形)

最近書いた WPF(C#)でサムネイルをドドンと表示するコード。

ImageHolder.cs

namespace DataTemplateTest
{
    public class ImageHolder
    {
        public string Path { get; set; }
    }
}

UrlToImageSourceConverter.cs

using System;
using System.Windows.Data;
using System.Windows.Media.Imaging;

namespace DataTemplateTest
{
    public class UrlToImageSourceConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return new BitmapImage(new Uri(value.ToString()));
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return null;
        }
    }
}

MainWindow.xaml

<Window x:Class="DataTemplateTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:DataTemplateTest"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <local:UrlToImageSourceConverter x:Key="UrlToImageSourceConverter"/>
    </Window.Resources>
    <Grid>
        <ListBox ItemsSource="{Binding}" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel />
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Border BorderThickness="1" BorderBrush="Gray">
                        <Image Source="{Binding Path, Converter={StaticResource UrlToImageSourceConverter}}" Width="50" Height="50"/>
                    </Border>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
</Window>

言わば↑ここまでが準備で↓実際のコードはこんだけ。

MainWindow.xaml.cs

using System.IO;
using System.Linq;
using System.Windows;

namespace DataTemplateTest
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            var files = Directory.GetFiles(@"c:\image");
            var images = files.Select(
                f => new ImageHolder()
                    {
                        Path = f
                    }).ToList();

            DataContext = images;
        }
    }
}

3か月前の自分がこのコード読んでも何もわからんかったやろと思う。
そもそも、WPFのアプリケーションなんか書いたことなかったし、今年の3月初にあったVSハッカソン倶楽部主催のVisual Studio勉強で初めてWPFに触れたような感じやった。
その後、今の職場になって自由にやらせてもらえる環境になったんで詳細を見越してWPFをやってみたは良いけど、まあ言っても我流の悲しさメッチャクチャなのな。

1つ目の転機はみつばたんのCafe Blend勉強会で直書きしないXAMLの教え。上のXAMLに余計なデフォルト属性がないのは、この教えの効果が非常に高い。
2つ目の転機はLINQ勉強会・・・と言いたいところやけど、Reshaperのコードアシスト。単純なループをLINQで書き直せってすすめてくれるのな。

ラムダ式が直観性が高いかどうかは、俺っちにもワカラン。C#のオブジェクト初期化子とコンストラクタの引数渡しでどっちが直観的か?慣れてなければ直観的じゃ無い。
モダンなC#ソースコードは直観的じゃ無いと思う。モダンなJavaScriptがそうであるように。
しかし、モダンなソースコードがそういう形に進化してるのは、当然理由があるわけでその理由の多くは SoC(Separate of Concern:関心事の分離)の実現であり、カップリングとコヒージョンの話であり、OCP(Open Close Principle)の実現なのな。
そして、それをなるべく平易に記述出来るように言語仕様を改良して、要するにシンタックスシュガーなわけだわね。

見慣れないから、とっつきにくいからって理由で避けてると次の世界が永遠に見ることができないと思うのな。

C#に限らなくても世の中はより便利な方に改善され続けてると思う。過去の資産が足かせになって身動きがとれないうちに身軽なライバルにどんどん先を越されないように、少なくとも自分自身は引き出しを持っとくべくだよね。
行ける状態になったら、全速力で走りだすための助走っていうかさ。

なので、インターネットや本の情報だけじゃ無くて勉強会とかに行く機会があれば行ってみると良いと思う。だって、みんな苦労して身に着けた得意技を惜しげも無く披露してくれるから。コスパ最高だぜ?
いつも関西で勉強会やってくれてるみんなありがとー