はじめに
6月の研修を終え、7月から初めての開発現場に配属されました。
現在は、C#、.NET Framework、SQL Serverを使用した業務システム開発に携わっています。
この記事では、初めて実務でシステム開発に取り組む中で学んだことや、特につまずいた 画面レイアウト設計とC#でのデータ取得・表示について、自分自身の振り返りも兼ねてまとめます。
1. 初案件で取り組んでいること
6月の研修を終え、7月から現場での開発が始まりました。
7月は主に画面レイアウトの設計、8月からは詳細設計と製造に着手しています。
現在の開発では、主に以下の技術を使用しています。
- C#
- .NET Framework
- SQL Server
- SQL Server Management Studio(SSMS)
画面レイアウト設計では、既存の画面仕様書を参考にしながら画面仕様書を作成し、Windows Formsのデザイナーを使用して画面レイアウトを作成してきました。
その後、詳細設計では画面クラスごとに処理の流れを整理し、他の開発者が設計書を見てコーディングできるように処理内容を記載します。
そして、詳細設計書をもとに実際のコーディングを行っています。
2. 画面レイアウト設計を通して学んだこと
最初に難しいと感じたのは、既存の画面仕様書を参考にして、同じような品質の設計書を作成することでした。
「見本があるなら、それを参考に書けばいい」と最初は考えていました。
しかし、実際に作成してレビューを受けてみると、
- 記載する内容の粒度が画面ごとに異なる
- 表記揺れがある
- 見本の記載方法を十分に踏襲できていない
- 必要な情報が抜けている
など、多くの指摘を受けました。
ここで学んだのが、「揃える」という意識です。
単純に必要な情報を書くだけではなく、既存の設計書と比較して、
「この画面ではここまで書いているから、この画面でも同じ粒度まで書く」
「この用語を使っているなら、別の場所でも同じ用語を使う」
というように、既存の成果物との統一を意識するようになりました。
設計書を作成する際には、内容そのものだけでなく、既存の成果物との一貫性も重要であるということを実務を通して学びました。
3. 初めてのコーディングでつまずいたこと
コーディングでは、すでに完成している画面のソースコードを参考にしながら、比較的難易度の低い画面から実装を始めました。
しかし、最初はコードを見ても、
「この処理は何をしているのか?」
という状態でした。
特に難しかったのが、データベースから取得したデータが、どのようにC#のプログラムに渡され、最終的に画面に表示されるのかという流れです。
例えば、DataGridViewというWindows Formsの表形式のデータ表示用コントロールがあります。
最初は、
SQLでデータを取得する
↓
C#のどこにデータが入る?
↓
そのデータをどうやってDataGridViewに表示する?
という一連の流れが理解できていませんでした。
さらに、
- DataTable
- DataRow
- List
- LINQ
- Select
- ToList
- DataGridView
- データバインド
など、分からない用語が一気に出てきました。
まだまだ知っていかないと実務でも通用しないと危機感を強く感じました。
4. DataGridViewにデータを表示できるまで
実際の開発では、データベースから取得したデータをDataTableなどで受け取り、それをC#側で扱いやすい形に変換してから画面に表示する処理を経験しました。
例えば、DataTableのデータをLINQを使ってクラスのリストに変換する処理があります。
LINQは、C#でコレクションやデータなどを検索・抽出・変換するための仕組みです。
DataTableに格納されたデータを、StatusクラスのListへ変換するサンプルプログラムを下記に示します。
using System;
using System.Data;
using System.Linq;
using System.Collections.Generic;
public class Status
{
public int Hp { get; set; }
public string Name { get; set; }
}
class Program
{
static void Main()
{
// DataTableを作成
DataTable dataTable = new DataTable();
// 列を追加
dataTable.Columns.Add("HP", typeof(int));
dataTable.Columns.Add("Name", typeof(string));
// データを追加
dataTable.Rows.Add(100, "Tanaka");
dataTable.Rows.Add(80, "Suzuki");
dataTable.Rows.Add(120, "Yamada");
// DataTableをList<Status>に変換
var list = dataTable.AsEnumerable()
.Select(row => new Status
{
Hp = row.Field<int>("HP"),
Name = row.Field<string>("Name")
})
.ToList();
// Listの内容を表示
foreach (var status in list)
{
Console.WriteLine($"名前:{status.Name}、HP:{status.Hp}");
}
}
}
実行結果
名前:Tanaka、HP:100
名前:Suzuki、HP:80
名前:Yamada、HP:120
この処理を最初に見たときは、AsEnumerable()やSelect()、row.Field()など、分からないものが多く、一つの処理として理解することができませんでした。
そこで、それぞれの処理を分けて考えるようにしました。
AsEnumerable()
DataTableのデータを、LINQで扱える形にします。
Select()
データを1件ずつ取り出し、別の形に変換します。
今回の例では、DataTableの1行をStatusクラスのオブジェクトに変換しています。
row.Field()
DataRowから指定した列の値を、指定した型で取得します。
例えば、
row.Field<int>("HP")
では、HP列の値をint型として取得しています。
ToList()
Select()によって変換したデータを、Listとしてまとめます。
今回の処理を流れで表すと、以下のようになります。
DataTable(SQLの実行結果を格納)
↓
AsEnumerable()でLINQを扱える形にする
↓
Select()でDataTableの行を1行ずつ取り出して変換する
↓
Statusオブジェクトを作成
↓
ToList()でStatusオブジェクトをListにまとめる
↓
List<Status>が完成
また、LINQにはデータを条件で絞り込むためのWhere()というメソッドもあります。
例えば、HPが100以上のデータだけを取得したい場合は、以下のように書くことができます。
var list = dataTable.AsEnumerable()
.Where(row => row.Field<int>("HP") >= 100)
.Select(row => new Status
{
Hp = row.Field<int>("HP"),
Name = row.Field<string>("Name")
})
.ToList();
この場合、Where()でHPが100以上の行に絞り込み、その後Select()でStatusオブジェクトに変換しています。
Where()は「条件で絞り込む」、Select()は「別の形に変換する」というイメージで理解しました。
このように、最初は一つの処理に見えていたコードを、それぞれのメソッドが何をしているのかに分けて考えることで、少しずつ処理の流れを理解できるようになりました。
そして、この流れを理解できて初めて、自分でDataGridViewへのバインドまで実装できました。
それまで点として見えていた知識が、データ取得から画面表示まで一本につながったように感じました。
5. レビューを通して学んだこと
最初の頃は、自分の実装について上司から説明を受ける時間が多く、レビューにも多くの時間を使っていただきました。
「自分の理解が足りないせいで、レビューする側の工数を増やしてしまっている」
と感じることもありました。
一方で、レビューで一つずつ処理の意味を確認していくことで、少しずつ自分でもコードの流れを追えるようになりました。
特に、一つ目の画面でデータ取得からDataGridViewへの表示までの流れを理解できたことで、二つ目以降の画面では、
「この画面も前の画面と同じような構成になっている」
「ここは前に使った処理が応用できそう」
と考えられる場面が増えてきました。
初めは「コードを写して動かす」状態でしたが、少しずつ既存コードを参考にしながら、自分で処理の流れを考える段階に進めていると感じています。
6. 今後の課題
現在の自分の課題は、特にSQLの理解です。
現在は、
- CASE
- EXISTS
- サブクエリ
- テーブル結合
など、SQLを読んだときに処理の意味をすぐに理解できない部分があります。
システム開発ではデータベースを扱う機会が多いため、C#だけでなくSQLについても継続して勉強していきたいと考えています。
また、C#ではLINQについても、さらに理解を深めたいと思っています。
現在は、
Select()
Where()
ToList()
などを少しずつ使うようになってきましたが、まだ「こういう処理ならLINQを使える」という判断がすぐにできる段階ではありません。
LINQをより理解することで、既存コードを読む力だけでなく、コードを簡潔にしたり、処理方法を提案したりすることにもつなげられるのではないかと考えています。