問題
高い保守性とコードの再利用性を可能にするような方法でコーディングしたコードがいくつかあります。特定のコードについて懸念があります。このコードが高いストレス下で崩壊するかどうかについて、専門家の意見を求めています。
コデス ##
public abstract class PlexxisDataTransferObjects : PlexxisDatabaseRow
{
//static methods
public static List<PlexxisDatabaseRow> GetAll();
//Constructors
public PlexxisDataTransferObjects(){ }
//Methods
public abstract bool Insert(OracleConnection Conn);
public abstract bool Update(OracleConnection Conn);
public abstract bool Delete(OracleConnection Conn);
public bool Insert()
{
using (var Conn = new OracleConnection(ConnectionString))
{
Conn.Open();
return Insert(Conn);
}
}
public bool Update()
{
using (var Conn = new OracleConnection(ConnectionString))
{
Conn.Open();
return Update(Conn);
}
}
public bool Delete()
{
using (var Conn = new OracleConnection(ConnectionString))
{
Conn.Open();
return Delete(Conn);
}
}
}
//Data Transfer Objects
public sealed class Apps : PlexxisDataTransferObjects
{
//Static Methods
public override static List<PlexxisDatabaseRow> GetAll()
{
List<PlexxisDatabaseRow> collection = new List<PlexxisDatabaseRow>();
using (var Conn = new OracleConnection(ConnectionString))
{
using (var Command = new OracleCommand("select * from APPS", Conn))
{
Conn.Open();
using (var reader = Command.ExecuteReader(CommandBehavior.CloseConnection))
while (reader.Read())
collection.Add(new Apps(reader));
}
}
return collection;
}
//Fields
public int AppId;
public string AuthKey;
public string Title;
public string Description;
public bool isClientCustomApp;
//Constructors
public Apps() : base () { }
public Apps(OracleDataReader reader) : base ()
{
if (reader["APP_ID"] != DBNull.Value)
this.AppId = Convert.ToInt32(reader["APP_ID"]);
if (reader["AUTH_KEY"] != DBNull.Value)
this.AuthKey = Convert.ToString(reader["AUTH_KEY"]);
if (reader["TITLE"] != DBNull.Value)
this.Title = Convert.ToString(reader["TITLE"]);
if (reader["DESCRIPTION"] != DBNull.Value)
this.Description = Convert.ToString(reader["DESCRIPTION"]);
if (reader["IS_CLIENT_CUSTOM_APP"] != DBNull.Value)
this.isClientCustomApp = Convert.ToBoolean(reader["IS_CLIENT_CUSTOM_APP"]);
}
//Methods
public override bool Insert(OracleConnection Conn)
{
string sql = string.Empty;
sql += "INSERT INTO APPS (APP_ID, AUTH_KEY, TITLE, DESCRIPTION, IS_CLIENT_CUSTOM_APP)";
sql += "VALUES(:appid, :authkey, :title, :description, :iscust)";
using (var Command = new OracleCommand(sql, Conn))
{
AppId = GetId();
Command.Parameters.Add(":appid", OracleDbType.Int32).Value = AppId;
Command.Parameters.Add(":authkey", OracleDbType.Varchar2).Value = AuthKey;
Command.Parameters.Add(":title", OracleDbType.Varchar2).Value = Title;
Command.Parameters.Add(":description", OracleDbType.Varchar2).Value = Description;
Command.Parameters.Add(":iscust", OracleDbType.Int32).Value = Convert.ToInt32(isClientCustomApp);
return Convert.ToBoolean(Command.ExecuteNonQuery());
}
}
public override bool Update(OracleConnection Conn)
{
string sql = string.Empty;
sql += "UPDATE APPS SET ";
sql += "AUTH_KEY = :authkey, TITLE = :title, DESCRIPTION = :description, IS_CLIENT_CUSTOM_APP = :iscust ";
sql += "WHERE APP_ID = :appid";
using (var Command = new OracleCommand(sql, Conn))
{
Command.Parameters.Add(":authkey", OracleDbType.Varchar2).Value = AuthKey;
Command.Parameters.Add(":title", OracleDbType.Varchar2).Value = Title;
Command.Parameters.Add(":description", OracleDbType.Varchar2).Value = Description;
Command.Parameters.Add(":iscust", OracleDbType.Int32).Value = Convert.ToInt32(isClientCustomApp);
Command.Parameters.Add(":appid", OracleDbType.Int32).Value = AppId;
return Convert.ToBoolean(Command.ExecuteNonQuery());
}
}
public override bool Delete(OracleConnection Conn)
{
string sql = string.Empty;
sql += "DELETE FROM APPS ";
sql += "WHERE APP_ID = :appid";
using (var Command = new OracleCommand(sql, Conn))
{
Command.Parameters.Add(":appid", OracleDbType.Int32).Value = AppId;
return Convert.ToBoolean(Command.ExecuteNonQuery());
}
}
}
私は何を見ていますか?
私が最も懸念しているのは、具象クラスの Insert、Update、および Delete を呼び出す抽象クラスの Insert、Update、および Delete メソッドです。
このようにして、必要に応じて接続を開いてトランザクションを明示的に開始し、トランザクションを送信し、オブジェクトに必要なことを実行させることで、トランザクションを有効にできるようにしました。さらに、40 ほどのクラスの 3 つのメソッドを明示的に書き直さなければならないとしたら、かなり面倒になる可能性があります。
ただし、接続を早期に開くと、データベースが滞る可能性があるのではないかと心配しています。いつでも更新される可能性のある入力データの量はわかりません。この状況では、2 つの主な考えがあります。抽象クラスで挿入、更新、および削除を抽象化し、Command.ExecuteNonQuery() の直前で明示的に接続を開きながらそれらを実装するか、そのままにしておくことができます。
私はあなたに何を望みますか?
まず、状況についてのあなたの意見。次に、ロジックの背後にある落とし穴や、たまたま見つけた悪いコーディングを指摘することも非常に役立ちます。