C#関数のインデント
現在のコードのインデントを改善したいと思っています。レビューや改善点をお聞かせいただければ幸いです。
public class DataAccess
{
public List<ComplaintModel> GetComplaint(string _OrderNumber)
{
throw new NotImplementedException();
}
public void InsertComplaint(
DateTime _Date,
string _OrderNumber,
string _CustomerName,
string _CustomerContactName,
string _Telephone,
string _Email,
string _CustomerReference,
string _Product,
string _PackSize,
string _BatchNumber,
DateTime _BestBeforeDate,
string _QuantityInvolved,
string _Details,
string _Comments)
{
using(MySqlConnection conn = new MySqlConnection(ConnectionString.ConnString))
{
List<ComplaintModel> complaint = new List<ComplaintModel>();
complaint.Add(new ComplaintModel { Date = _Date,
OrderNumber = _OrderNumber,
CustomerName = _CustomerName,
CustomerContactName = _CustomerContactName,
Telephone = _Telephone,
Email = _Email,
CustomerReference = _CustomerReference,
Product = _Product,
PackSize = _PackSize,
BatchNumber = _BatchNumber,
BestBeforeDate = _BestBeforeDate,
QuantityInvolved = _QuantityInvolved,
Details = _Details,
Comments = _Comments});
conn.Execute(@"INSERT INTO customer_complaints
(date_taken, order_number, customer_name, customer_contact, telephone, email, customer_reference, product, pack_size, batch_lot_number,
best_before_date, quantity_involved, details, comments)
VALUES (@Date, @OrderNumber, @CustomerName, @CustomerContactName, @Telephone, @Email, @CustomerReference, @Product, @PackSize, @BatchNumber,
@BestBeforeDate, @QuantityInvolved, @Details, @Comments)", complaint);
}
}
}
回答
私が使用する2つの場所がありますvar:
var conn = new MySqlConnection(ConnectionString.ConnString)
var complaint = new List<ComplaintModel>();
使用中のブロックを中かっこで囲む必要がなくなり、インデントレベルが1つ節約されます。
using var conn = new MySqlConnection(ConnectionString.ConnString);
最初のパラメーターを行の終わりに配置し、残りを新しい行に配置しないでください。最初のパラメータも新しい行に配置します。
complaint.Add(new ComplaintModel {
Date = _Date,
...
クエリ文字列を新しい行で開始すると、1つのインデントレベルに戻すことができます。
conn.Execute(
@"INSERT INTO customer_complaints
...
Dennis_Eにはいくつかの良いアドバイスがありますが、私が別の方法で行う2つの項目があります。
SQLの挿入ステートメントはそのままで問題なく表示されます。コードは問題なく読み取れますが、ステートメントを格納するためにクラスでプライベート定数を宣言します。
オブジェクト初期化子の中括弧も独自の行に配置します。
complaint.Add(new ComplaintModel { Date = _Date, OrderNumber = _OrderNumber, CustomerName = _CustomerName, CustomerContactName = _CustomerContactName, Telephone = _Telephone, Email = _Email, CustomerReference = _CustomerReference, Product = _Product, PackSize = _PackSize, BatchNumber = _BatchNumber, BestBeforeDate = _BestBeforeDate, QuantityInvolved = _QuantityInvolved, Details = _Details, Comments = _Comments });
インデントとは関係のないいくつかの追加の観察:
パラメータの名前を、先頭にアンダースコアを付けてPascalCaseではなくcamelCaseに変更します。C#の慣用的な命名規則はで
quantityInvolvedはなくです_QuantityInvolved。取るに足らないように聞こえるかもしれませんが、Shiftキーやアンダースコアキーに手を伸ばすと、入力速度が遅くなります。それは「千枚の紙切れによる死」です。速度のわずかな低下自体は問題ではありません。コードを入力しているときにこれを毎日何百回も掛けると、合計されます。
14個のパラメーターを持つメソッドがありますが、これは多すぎます。これらのパラメーターの名前も、C#で通常使用される名前(camelCased)に従わず、アンダースコアプレフィックスもありません。
を構築してComplaintModelそれをに渡してみませんInsertComplaint()か?
DataAccessIMHOはあまりにも一般的な名前です。これを数十のメソッドで埋めて、すべてのデータベースロジックをそこに集中させたくなるでしょう。そうすると、管理できなくなります。たとえば、苦情に関連するメソッドがある場合や、完全なCQRSを使用する場合は、「ComplaintsService」を使用することを検討してください。
名前を無意味に省略しないでください。私は一緒に暮らすことができますがconn(私は好きですがmySqlConnection)、ConnString無意味です。という名前のクラスの問題を回避するためにこれを行ったと思いますConnectionStringが、そのクラスの名前を変更する必要があります。
固有名詞を付ける:List<ComplaintModel> complaint文字通り苦情のリストであるため間違っているため、と呼ぶ必要がありますcomplaints。
インラインSQLが長くなると、私はインラインSQLのファンではありません。私は.SQLスクリプトを埋め込み、QueryRetrieverを使用してそれらを読み取るのが好きです。利点は、そのような.SQLスクリプトもVisual Studioで色分けされることです(ただし、SQL Server、MySql、Oracleなど、クエリの種類に基づいて異なる拡張子を付ける方法があればいいのですが)。