【VisualStudio チュートリアル】IDE 新機能

チュートリアルは、Visual Studio 2015 RC で作成されています。 

本記事は、Visual Studio 2015の新しい機能の中からピックアップしてご紹介するチュートリアルです。

より使いやすい開発環境

プロジェクトの新規作成から [コンソールアプリケーション]を選択し 、Visual Studio 2015の右上にある「サインイン」をクリックしましょう。

01_Sign_In

Visual Studio 2015では、Microsoft Azure、開発者アカウントなどのサービスを使っていても、その都度アカウントをログインすることなく切り替えることが可能です。自分のアカウントの箇所をクリックすると、[アカウントの設定…] という項目がでてくるので、選択すると自分のアカウント情報が確認できます。

02_Account_Setting

筆者の環境ではアカウントは一つですがアカウントが追加できるようになっています。

03_Personal_Account

サインインすると、自分のVisual Studio 2015のウインドウレイアウトの設定を記憶させておくことができます。
そして、これは、同じアカウントを使っている他のマシンとも共有されます。

このウインドウレイアウトが気に入ったとします。下記のように [ウインドウ] – [ウインドウレイアウトの保存] を選択してください。

04_Save_Layout

保存したいウインドウレイアウトの名前を記入しください。

05_Save_Layout_Name

試しに画面右側にあるソリューションエクスプローラー、チームエクスプローラーのウインドウを閉じてみます。

06_Layout_01

下記のように [ウインドウ] – [ウインドウレイアウト適用] – [コード作成用] を選択してください。

07_Select_Code_Layout

無事元のウィンドウレイアウトに戻りました。

08_Back_To_Original_Layout

Visual Studio 2015では、これの他にも、Surfaceなどで使えるタッチパネル対応なども実施されています。
詳しくはこの動画をご覧ください。

Visual Studio: An IDE For All Your Modern Devices & Services (英語)
https://channel9.msdn.com/Events/Visual-Studio/Connect-event-2014/710?wt.mc_id=relatedsession

アプリケーションの構造解析 〰コードマップ〰

次にご紹介するのは、コードマップという機能をご紹介いたします。
この機能はコードの構造を見える化するためのものです。
この機能は、多少複雑な構造をもつクラスではないと面白くありませんので、コンソールアプリケーションのプロジェクトを作成して次のコードを作成してみてください。
プロジェクト名をShachoProjectにして、下記の4つのコードをそれぞれ4つのクラスファイルに貼り付けてください。

Shain.cs

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ShachoProject
{
    abstract public class Shain
    {
        abstract public string StandUp();
        abstract public int Salary();
        public int BaseSalary {get; set;}
    }

    public class Tanto : Shain
    {
        public override int Salary()
        {
            return BaseSalary;
        }
        public override string StandUp()
        {
            return "担当が普通に立ちました";
        }
    }

    public class Shunin : Shain
    {
        public override int Salary()
        {
            return BaseSalary * 2 + 1;
        }
        public override string StandUp()
        {
            return "主任が素早く立ちました";
        }
    }

    public class Bucho : Shain {
        public override int Salary()
        {
            return BaseSalary * 3;
        }
        public override string StandUp()
        {
            return "部長がだるそうに立ちました";
        }
    }
}

ShainFactory.cs

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ShachoProject
{
    public class ShainFactory
    {
        public Shain Create(string yakushoku)
        {
            switch (yakushoku) {
                case "担当":
                    return new Tanto();
                case "主任":
                    return new Shunin();
                case "部長":
                    return new Bucho();
                default:
                    throw new ArgumentException("該当する役職がありません"); 
            }
        }
    }
}

Shacho.cs

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ShachoProject
{
    class Shacho
    {
        public static void Main()
        {
            Console.WriteLine("役職は?");
            var yakushoku = Console.ReadLine();
            Console.WriteLine("基本給は?");
            var baseSalary = Console.ReadLine();
            var shain = new ShainFactory().Create(yakushoku);
            shain.BaseSalary = int.Parse(baseSalary);
            Console.WriteLine(shain.StandUp());
            Console.WriteLine("給料は" + shain.Salary() + "ドルです");
        }
    }
}

ShainTest.cs

 using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace ShachoProject
{
    [TestClass]
    public class ShainTest
    {
        [TestMethod]
        public void TestCalcSalary()
        {
            var shain = GetShainWithBaseSalary100("担当");
            Assert.AreEqual(100, shain.Salary());
        }

        [TestMethod]
        public void TestCalcSalaryForShunin()
        {
            var shain = GetShainWithBaseSalary100("主任");
            Assert.AreEqual(201, shain.Salary());
        }

        [TestMethod]
        public void TestCalcSalaryForBucho()
        {
            var shain = GetShainWithBaseSalary100("部長");
            Assert.AreEqual(300, shain.Salary());
        }
        private Shain GetShainWithBaseSalary100(string role)
        {
            var shain = new ShainFactory().Create(role);
            shain.BaseSalary = 100;
            return shain;
        }
    }
}

これを作成して、ビルドを実施し、テストを流してみましょう。

11_Run_Test

テストが全部通れば準備完了です。

12_Run_Test_Result

コードマップを作成するためには [アーキテクチャ] – [ソリューションのコードマップを生成] を選択します。

13_Generate_Solution_Code_Map

次のような画面になります。

14_ShachoProject

このコードはどのような構造でしょうか?ShachoProject.exeにマウスカーソルを合わせましょう。

15_Select_V_mark

次のような画面になります。左側のvマークをクリックしてみましょう。

ShachoProject.exeの内部構造が展開されました。

これをどんどん続けていって、どんどん内部を見るようにしてみましょう。

16_Click_Inside

さらに内部をクリックすると、かなりプログラムの全体構造が見えてきました。

ピンクが依存、緑が継承、グレー線が依存を表しています。

17_Relationship

さらに各クラスをクリックすると、クラスの内部構造が明らかになってきました。

メソッドや、属性を見ることができます。

18_Click_Class

メソッドをクリックすると、そのメソッドが内部でどのメソッドや属性に依存しているかを見ることができます。

この構造の場合、ShachoのMain メソッドは、ShainFactoryとShainには依存していますが、Bucho, Tanto, Shuninというクラスには依存していないようだということがわかりました。

19_Click_Main_Method

クラスの内部構造を明らかにするコードマップの機能をより知りたい方は次のリンクをご参照ください。

Code Map improvements in Visual Studio 2015 CTP6 (英語)

https://blogs.msdn.com/b/visualstudioalm/archive/2015/02/23/code-map-improvements-in-visual-studio-2015-ctp6.aspx

Visual Studio 2015 IDE Productivity(英語)

https://channel9.msdn.com/Events/Visual-Studio/Connect-event-2014/028?wt.mc_id=relatedsession

よりわかりやすくなったタスク

上記のコードを使ってさらにみて行きましょう。Shain.cs の Tanto クラスの中身を削除してみましょう。

このコードでは、Shainという抽象クラスがあり、抽象メソッドStandUp()を持っています。

それを継承したクラスはそれを実装しないといけませんが、そうできていないので、IDE 上でどのようにすればいいかのタスクを示してくれます。

この機能のことをライトバルブと言います。

20_Task

コード分析機能の強化

このように、大変便利なライトバルブですが、すでに準備されている追加ルールを導入することができます。

これは、わかりやすい動画が存在するので、それをご覧ください。

Improve Your Code Quality Using Live Code Analyzers(英語)

https://channel9.msdn.com/Events/Visual-Studio/Connect-event-2014/714?wt.mc_id=relatedsession

診断機能の強化

最後に診断機能です。

Visual Studio 2015 は診断機能がさらに協力になっています。

コードマップのところで使ったアプリケーションを使って診断をかけていきましょう。

デバッグの時に使いやすい診断の方法として次のようなものがあります。

ブレイクポイントを設定しましょう。デバッグ中に止めたい箇所のコードの左側をクリックします。

今回は、ShainTest.cs の [var shain = new ShainFactory().Create(role);] の行に設定します。

21_Break_Point

ブレイクポイントにカーソルを乗せると [設定…] という箇所がでてきます。

それを選択すると、下記のようにブレイクポイントの設定がコード上で設定できるようになります。

23_Break_Point_Setting

ブレークポイントをShainTest.csの下記のメソッドに二か所設定します。

[var shain = new ShainFactory().Create(role);]

[return shain;]

このメソッドは繰り返し実行されます。その後、[テスト] – [デバッグ] – [すべてのテスト] で、ユニットテストを実行します。

25_Debug_Run

最初のブレイクポイントで動作が一旦停止します。
画面上部の [続行] ボタンを押して次のブレークポイントまで進めましょう。

26_Debug_Now

そうすると、前のブレークポイントから、次のブレークポイントまでの、経過時間(Elapsed time)が表示されています。

これをクリックします。

27_Debug_Elapse_Time

診断画面では様々なデータが、時系列でみることができます。

28_Debug_Image

さらに、スナップショットをとって、ブレイクポイントごとの状態と、オブジェクトの増分などが見れるようになっています。

29_Snap_Shot

いろんな指標をぜひ皆さんの手で確かめてください。

診断機能に関するリソースは次の通りです。

Debugging and diagnostics enhancements in Visual Studio 2015(英語)

https://msdn.microsoft.com/en-us/library/dn874014%28v=vs.140%29.aspx

以上です。Visual Studio 2015で、快適なプログラミングライフを送ってください!