C#

【プログラミング】悪いコードの特徴について解説する【C#】

プログラミングをしていると「良いコード」「悪いコード」ということを耳にします。
この記事では、まず「悪いコード」とはどのようなものなのかを確認した上で、「良いコード」とはどのようなものなのかを解説します。

今回も実際にアプリケーションを実装して説明していきます。
ざっと仕様をまとめると「ボタンを押下したら、データベースより値を取得して画面に表示する」という簡単なものを例にします。

アプリケーションを作成して解説します!

それでは悪い行動を実装していきますまずいつもの通りVisualStudioでプロジェクトを作っていきます。

プロジェクトを作成しよう!

まず、Visual Studioを起動しましょう。
今回、エリ狐はVisual Studio 2019を使用しますが、2017でも2015でも可です。
プロジェクト作成
図のように「Windowsフォームアプリケーション(.NETFrameWork)」を選択し「次へ」を押下します。

プロジェクト名称は適当で大丈夫です。
私は「PROTEIN」というプロジェクト名にして、作成しました。

すると、Form1.cs[デザイン]が表示されるので以下のプロパティ設定をしてください。

Form1のサイズ size: 300, 300
Buttonの追加 (Name):ShowButton
Text: 表示
TextBoxの追加 (Name):InputTextBox
Labelの追加 (Name):IDLabel
Text: ID(Name):Label1
Text: メーカー名(Name):Label2
Text: 含有量(Name):MakerNameLabel
Text: —-(Name):ContentLabel
Text: —-


このようにラベルとボタンを配置してください。

次にボタンクリック時のイベント処理を追加します。
「Form1」に配置したボタンをダブルクリックするとボタンのクリックイベントが自動的に生成されます。

赤枠の処理が追加されたらOKです。
この枠で囲った処理は、処理名称(メソッド名)の通り、「ShowButton_Click」ボタンをクリックすると起動されます。

アプリ実装!

今回は、「ボタンを押下したら、データベースより値を取得して画面に表示する」という仕様のアプリケーションを実装します。

事前準備

データベースはSQLiteを使用します。(フリーのデータベースですので、DLしてみてください!)…インストール方法はぐぐってくれ;
事前にSQLiteに「TEST」データベースに「PROTEIN」というテーブルに値を登録していました。

ID TEXT(Integerでもいいかも):主キー
MakerName TEXT
Content TEXT

NuGetパッケージより「sqlite」をインストールする


参照を右クリックし、「NuGetパッケージの管理」をクリックします。

参照タブより「sqlite」と検索します。
画像のように「sqlite」をインストールしてください!

インストールが完了したら、参照の追加をします。

処理を書いていく!

using System;
using System.Data;
using System.Data.SQLite;
using System.Windows.Forms;

namespace PROTEIN
{
    public partial class Form1 : Form
    {
        private readonly string ConnectionString =
                @"Data Source=C:\Users\syuns\Desktop\pupsqlite_ver_1320201\TEST.db;Version=3;";

        public Form1()
        {
            InitializeComponent();
        }

        private void ShowButton_Click(object sender, EventArgs e)
        {
            string sql = @"
                            SELECT MakerName,
        	                       Content
                            FROM PROTEIN
                            WHERE ID = @SetID
                          ";
            DataTable dt = new DataTable();
            using (var connection = new SQLiteConnection(ConnectionString))
            using (var command = new SQLiteCommand(sql, connection))
            {
                connection.Open();

                command.Parameters.AddWithValue("@SetID", this.InputTextBox.Text);
                using (var adapter = new SQLiteDataAdapter(command))
                {
                    adapter.Fill(dt);
                }

            }

            if (dt.Rows.Count > 0)
            {
                MakerNameLabel.Text = dt.Rows[0]["MakerName"].ToString();
                ContentLabel.Text =
                    RoundStr(Convert.ToSingle(dt.Rows[0]["Content"]), 2) + "g";
            }
        }
        private string RoundStr(float value, int decimalPoint)
        {
            var temp = Convert.ToSingle(Math.Round(value, decimalPoint));
            return temp.ToString("F" + decimalPoint);
        }
    }
}
実行すると「1」を入力すると無事にメーカ名と含有量がテーブルより取得できました。

実装したアプリの悪いところ

実装したアプリケーションのコードで、どこが悪いのかを解説します。
今回のようにコードビハインドに関数や定数など全て定義するような実装方法は、文法を習得したばかりの頃(初心者にありがち)であればやってしまいがちだと思います。

今回は、データベースより値を取得して画面に表示するという簡単なアプリケーションを作成しました。
しかしながら、実装したアプリケーションの「どこらへんが悪かった」のでしょうか?

あなたはわかりますか?それでは一緒に見ていきましょう!

文法の知識のみでコーディングしている

今回実装したアプリケーションの全体を振り返ると、「オブジェクト指向」のプログラミングではなく、言語の知識しかないエンジニアが動作するプログラムを書いたようなものですね。
しかし、新人エンジニアや駆け出しエンジニアといった”文法を学んだだけ”のような方は、これが悪いコーディングという意識がないと思います。

悪気がないというか…自覚がないのです、
なぜなら、「悪いコード」と分かるためには比較対象である「良いコード」とは何か知らなければそもそも分からないのです。

実際に現場でコーディングをしている方も、このような「文法の知識のみ」でコーディングしていることが多いと思います。
「文法の知識のみ」でプログラミングがちゃんとできているかの指標は

  • コンパイルが正常に通ること
  • エラーが発生しないこと

この2つしか視点がありません。
この2つがクリアされていれば、「ちゃんとかけている」という認識になってしまうでしょう。

このような悪いところの指摘は、経験豊富な先輩や先生にチェックしてもらわなければ分かりません。
「文法の知識のみ」でプログラミングは実際に動作はするので、「動いているから問題ない」という悪いコーディングをしているという自覚がなかなか持てないのです。

「文法の知識のみ」でプログラミングを改善していくためには、「自分で勉強して良い行動を書く」ということをしなければなりません。
僕は新人の時に教えてくれる先輩がいなかったので、ここら辺はかなり苦戦をしたことを覚えています。

したがって、コーディングができない人の気持ちがかなりは良く分かります。
ぜひ良いコードをたくさん見て、良いコードが書けるように意識していきましょう!

脱!文法の知識のみプログラミング

改善する点は大きく分けて「3つ」あります!

SQL定義は直接書かないこと!

FormのコードビハインドにSQL定義をしています。
このように直接書いてしまうと何が悪いのか。

それは、別のFormでも同じような処理が必要になった場合、privateな変数ですので、他のFormaから呼び出せません。
アプリケーション開発は複数人で作業することが多いため、あなたが作成したSQLを他の人も使いたいという場面が出てきます。

反対にあなたが他の人が作成したSQL文を使用したいという場面もあります。
このようにコードビハインドに定義すると他の処理で呼び出すことができないので同じような定義を作成しなければ。。。と”重複”してしまいます。

作成してから1箇所にまとめれば良くない?

「修正してから1箇所にまとめてしまえば良い」ということもあるかもしれません。
しかし、これは「同じ人がコーディングしていれば」問題ありません

なぜなら、アプリケーション開発はチームで行い、大体の現場は複数人で作業しています。
この場合、知っている人は気づけますが、現場に参画したての方、エンジニア経験が少ない方にとっては”見落とし”がちです。
そして「かなり探すのが難しい」です。

したがってSQL文の定義場所は”共通化”させていることが望ましいです。

DB定義やタイムアウト時間は直接書かないこと!

データベースの接続先やSQLのタイムアウト時間など、アプリケーション全体にかかる設定をコードビハインド側に定義しています。
このようなアプリケーション全体の設定は、他の画面でも処理でも基本的に同じものを使用します。

バラバラだと統一性がないアプリケーションになってしまいます!

したがって1つの画面だけ変えることは良くないことになります。
例えば、「タイムアウト時間を60秒から100秒に変更したい」といった場合に複数画面にそれぞれ定義していると、それら全てを検索して修正しなければなりません。

また修正漏れも発生する可能性もありますし、確認試験もその修正分やる必要があります。
1箇所にまとめる”共通化”することで修正は分散されず、確認もそこだけ確認すれば良いということになるため、「工数削減」に繋がります。

単位や値の計算・補正は直接書かないこと!

取得したデータに単位を設定しているところがありますが、この「単位」はアプリケーション全体で使う可能性が非常にあります。
例えば、「履歴を一覧で表示する」「画面にグラフを表示する」といった処理では単位を表示することはあります。

また、四捨五入や丸めというビジネスロジックもコードビハインド側に書いてしまうと、画面が増えれば増えるほど修正が大変になります。

このように”単位や値の計算・補正”というものは、画面や処理が増えれば増えるほど修正が大変になってしまうので「基本的に1箇所にまとめる」ようにしましょう。

プログラミングスキルの取得には段階がある

今回は、「悪いコード」と何か見ていきました。
しかし、今回紹介したことは”文法を勉強したばかり”の頃に良くあることです。

プログラミングスキルというものは、良くなる段階があります。
まず1段階目は、「重複したコードに気づくことができる」ということです。

同じようなロジックを書くことで、「メンテナンスが大変だと」保守性について分かってきます。
この段階に達したら、2段階目「共通化を意識できる」というフェーズにきます。

似ている処理を「1カ所」にまとめるという発想ができるようになります。
この2段階までが現場で育ったエンジニアの大体の人がストップする位置。

つまり、このラインまでは誰でもいけるということです。
ではこの次のフェーズにいくためにはどうすればいいのか。。。

「勉強するしかない」
ということです。

それは人に教えてもらうことも良いですし、C#であれば「オブジェクト指向」、「テスト駆動」、「ドメイン駆動」を勉強していく必要があります。
このブログでも取り扱っていくので楽しみにしていてください!

またプログラミング学習の独学はモチベーションが上がらなかったり、分からないところがすぐ聞けないので辛い時がたくさんあります。
プログラミングスキルの最速で身に着けるには”人に教えてもらう”ことです。

言葉も同じじゃないでしょうか?分からないところをすぐに聞くことができる。
その環境はかなり価値のある状態です。

そんな「悩み」を解決するオンラインコンテンツがあります!
「CodeCamp」こちらは僕も過去にマスターコースを受講していました。
CodeCamp

無料体験でも、マンツーマンで丁寧に教えてくれるのでかなりオススメですのです!ぜひチェックしてみてください!