我有以下BLL (业务逻辑层)类。这是我创建的第一个类,它从UI (其中这个类被实例化/创建/调用)根据业务规则取消了所有的责任。此代码的目标是在需要添加控件或字段并插入到数据库的情况下具有可重用性和灵活性。
public class MillInsController
private MillInspectionTableAdapter _millDt = null;
protected MillInspectionTableAdapter Adapter
{
get
{
if (_millDt == null)
_millDt = new MillInspectionTableAdapter();
_millDt.ConnectionString = Login.LoginController.UserConnString;
return _millDt;
}
}
public static void InitMillForm(Form millform)
{
switch (DateTime.Now.Year)
{
case 2016:
millform.Controls["txtPrefEnd"].Text = "ES";
millform.Controls["txtPrefStart"].Text = "ES";
break;
case 2017:
millform.Controls["txtPrefEnd"].Text = "ET";
millform.Controls["txtPrefStart"].Text = "ET";
break;
case 2018:
millform.Controls["txtPrefEnd"].Text = "EU";
millform.Controls["txtPrefStart"].Text = "EU";
break;
case 2019:
millform.Controls["txtPrefEnd"].Text = "EV";
millform.Controls["txtPrefStart"].Text = "EV";
break;
case 2020:
millform.Controls["txtPrefEnd"].Text = "EW";
millform.Controls["txtPrefStart"].Text = "EW";
break;
case 2021:
millform.Controls["txtPrefEnd"].Text = "EX";
millform.Controls["txtPrefStart"].Text = "EX";
break;
case 2022:
millform.Controls["txtPrefEnd"].Text = "EY";
millform.Controls["txtPrefStart"].Text = "EY";
break;
case 2023:
millform.Controls["txtPrefEnd"].Text = "EZ";
millform.Controls["txtPrefStart"].Text = "EZ";
break;
}
}
public DialogResult InsertMillData(Form form)
{
string inValue = "";
bool TransactionStat = true;
ComboBox cbCoil = form.Controls["cbCoilNumber"] as ComboBox;
ComboBox cbShift = form.Controls["cbShift"] as ComboBox;
string JobNumber = form.Controls["txtJobNumber"].Text;
string PipeSize = form.Controls["txtDiameter"].Text + "X" + form.Controls["txtThickness"].Text + "X" + form.Controls["txtLength"].Text;
string HeatNumber = form.Controls["txtHeatNumber"].Text;
string CoilNumber = cbCoil.SelectedItem.ToString();
string pipePrefix = form.Controls["txtPrefStart"].Text;
string PipeNumberStart = form.Controls["txtPipeNumberStart"].Text;
string PipeNumberEnd = form.Controls["txtPipeNumberEnd"].Text;
string Length = form.Controls["txtLength"].Text;
string Thickness = form.Controls["txtThickness"].Text;
string Diameter = form.Controls["txtDiameter"].Text;
string Mass = form.Controls["txtMass"].Text;
string SNo = form.Controls["txtSNo"].Text;
string SheetNumber = form.Controls["txtSheetNumber"].Text;
string SteelGrade = form.Controls["txtSteelGrade"].Text;
string Operator = form.Controls["txtOperator"].Text;
InputBox("Coil Number", "Enter Coil Number used for Sheet:" + form.Controls["txtSheetNumber"].Text, ref inValue);
if (inValue != cbCoil.SelectedItem.ToString().Trim())
{
TransactionStat = false;
return MessageBox.Show("ERROR! Please check Coil Number entered for Sheet.");
}
else
{
if ((pipePrefix + PipeNumberStart).Length < 8 || (pipePrefix + PipeNumberEnd).Length < 8)
{
TransactionStat = false;
return MessageBox.Show("Pipe Number range incorrect format.");
}
foreach (Control controls in form.Controls)
{
if (controls is TextBox)
{
if (String.IsNullOrWhiteSpace(controls.Text))
{
controls.BackColor = Color.Red;
TransactionStat = false;
}
else
{
controls.BackColor = Color.White;
}
}
if (controls is ComboBox)
{
var cb = controls as ComboBox;
if (String.IsNullOrWhiteSpace(cb.SelectedItem.ToString()))
{
cb.BackColor = Color.Red;
TransactionStat = false;
}
}
}
if (TransactionStat == false)
{
return MessageBox.Show("PLEASE PROVIDE ALL REQUIRED FIELDS, CHECK HIGHLIGHTED (RED) FIELDS TO CORRECT THE ERROR. CAPTURE ABORTED.", "ERROR OCCURED");
}
else
{
List<string> pipes = new List<string>();
int start = Int32.Parse(PipeNumberStart);
int end = Int32.Parse(PipeNumberEnd);
int endlen = end.ToString().Length;
while (start <= end)
{
int startlen = start.ToString().Length;
pipes.Add(pipePrefix.PadRight(8 - startlen, '0') + start);
start++;
}
MillInsController millinsctrl;
millinsctrl = new MillInsController();
//INSERT MILL
foreach (var pipe in pipes)
{
Adapter.Insert(
Mass, Diameter, Thickness, SNo, JobNumber,
SheetNumber, SteelGrade, cbShift.SelectedItem.ToString(),
Operator, HeatNumber, cbCoil.SelectedItem.ToString(), pipe, Length);
}
return MessageBox.Show("INSERT SUCCESSFULL");
}
}
}
public static DialogResult InputBox(string title, string promptText, ref string value)
{
Form form = new Form();
Label label = new Label();
TextBox textBox = new TextBox();
Button buttonOk = new Button();
Button buttonCancel = new Button();
form.Text = title;
label.Text = promptText;
textBox.Text = value;
buttonOk.Text = "OK";
buttonCancel.Text = "Cancel";
buttonOk.DialogResult = DialogResult.OK;
buttonCancel.DialogResult = DialogResult.Cancel;
label.SetBounds(9, 20, 372, 13);
textBox.SetBounds(12, 36, 372, 20);
buttonOk.SetBounds(228, 72, 75, 23);
buttonCancel.SetBounds(309, 72, 75, 23);
label.AutoSize = true;
textBox.Anchor = textBox.Anchor | AnchorStyles.Right;
buttonOk.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
buttonCancel.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
form.ClientSize = new Size(396, 107);
form.Controls.AddRange(new Control[] { label, textBox, buttonOk, buttonCancel });
form.ClientSize = new Size(Math.Max(300, label.Right + 10), form.ClientSize.Height);
form.FormBorderStyle = FormBorderStyle.FixedDialog;
form.StartPosition = FormStartPosition.CenterScreen;
form.MinimizeBox = false;
form.MaximizeBox = false;
form.AcceptButton = buttonOk;
form.CancelButton = buttonCancel;
DialogResult dialogResult = form.ShowDialog();
value = textBox.Text;
return dialogResult;
}
public bool updateMill(string stat, string scrapl, string length, string pipenum)
{
ds_Mill.MillInspectionDataTable mill = Adapter.GetDataByPipe(pipenum);
if (mill.Count == 0)
{
return false;
}
ds_Mill.MillInspectionRow millrw = mill[0];
_millDt.Update(stat, scrapl, length, pipenum);
int rowsAffected = Adapter.Update(millrw);
// Return true if precisely one row was updated,
// otherwise false
return rowsAffected == 1;
}
public ds_Mill.MillInspectionDataTable getSheet(string sheet)
{
return Adapter.GetDataBySheetNum(sheet);
}
public System.Data.DataTable fillDataGridMillIns(string sheetnum)
{
try
{
MillInsController millIns = new MillInsController();
return millIns.getSheet(sheetnum);
}
catch (SqlException ex)
{
MessageBox.Show(ex.ToString());
return null;
}
catch (InvalidOperationException exOp)
{
MessageBox.Show(exOp.ToString());
return null;
}
}
}发布于 2019-02-26 15:23:58
类不是“业务逻辑层”类,因为它仍然深深植根于用户界面。如果没有有效的窗体控件,就无法执行该类的逻辑,因此需要用户界面来执行该逻辑。
“业务逻辑层”的全部意义是将不需要用户界面的逻辑集中到自己的类集合中。
MillInsController所表现出来的是一个UserControl,它可以用于构建可重用的用户界面组件。这仍然是一个有效的模式,但不是作为一个单独的类。通常,UserControl是作为视图+控制器代码的配对创建的,这些代码可以嵌入到其他用户控件中。
在这门课上,我真的没有看到太多的业务逻辑。它运行基本表单验证(您是否在字段中放置了某些内容),并执行从字符串到数字类型的基本数据转换。除此之外,它还调用数据访问层。
补充意见:
PipeSize变量被声明并初始化,但从未使用过。InitMillForm方法可以通过使用值字典来设置字典中键为年份的表单字段来清理,并且值可以是前缀: var var= DateTime.Now.Year;var preferences = new Dictionary() {{ 2016,"ES“},{ 2017,"ET”},{ 2018,"EU“},{ 2019,"EV”},{ 2020,"EW“},{ 2021,"EX”},{ 2022,"EY“},{ 2023,"EZ”} };millform.Controls“txtPrefEnd”.Text = preferences年;millform.Controls“txtPrefStart”.Text = preferences年;foreach (var pipe in pipes)循环中),您都要传递一串字符串参数。考虑创建一个类来表示要插入的内容,并使用适当的数据类型。例如,直径很可能是decimal而不是string。InsertMillData方法创建自己的一个新实例,然后不再使用它。这段代码应该删除。我不知道为什么类的实例方法需要创建自身的另一个实例,因为它已经能够在自身上调用实例方法。if语句中重构代码。检查if语句中条件的代码可以重构到它自己的方法中,并给出一个正确的名称,这样您就可以在6个月后返回到这段代码中,并且知道: if (pipePrefix + PipeNumberStart).Length <8区(pipePrefix+ PipeNumberEnd).Length < 8)实际上意味着: if (pipePrefix,PipeNumberStart,PipeNumberEnd).私有bool IsInvalidPipeNumberRange(string pipePrefix,string pipeNumberStart,string pipeNumberEnd) { return (pipePrefix + pipeNumberStart).Length <8欧元(pipePrefix + pipeNumberEnd).Length <8}发布于 2019-02-27 00:04:37
我只想在前面提到的建议之外补充一些意见:
InputBox这样的方法可能会容易一些:繁琐的事情应该由机器(嗯,计算机)来完成。此外,在许多情况下,这还允许您在保持比例等的同时更容易地重新分配窗口和对话框。也就是说,当我输入FlowLayoutPanel和这个职位时,搜索中会弹出TableLayoutPanel或winforms。if (x == false) ... --这只是if (!x);... == true --这只是...本身,不需要与true或false相比。ERROR! Please check Coil Number entered for Sheet.,而是可以说类似于ERROR! Input '%s' doesn't match Coil Number '%s' entered for Sheet. (当然有适当的参数)。Pipe Number range incorrect format.也一样..。告诉我什么是我必须直接进入的,我哪里出了问题。使用可以自动生成的正确库,但我怀疑仅用这几个检查就可以很容易地手动完成。InsertMillData就可以在一个屏幕上全部读取!InitMillForm -你到底要维持多久?如果我们已经过了2023年,也许添加一个默认的大小写并给出一个有用的信息.updateMill中的注释应该是该方法的docstring。在现在的情况下,它是没有用的,我已经知道它是怎么说的了,只看它下面的那一行,它的长度就短了很多。但是,作为方法的docstring,我实际上知道updateMill的契约是什么。当然,我还是不知道这些参数意味着什么。也就是说,我重视自我描述代码.但是你也必须让它更易读。例如,scrapl,多花几个字符来拼写它,并让读者立即知道该参数包含什么(除了它是一个字符串,是的,但这是提到的)不会有什么害处。特定于域的数据类型对于理解和防止错误是很好的,因为参数顺序被意外翻转等等)。TransactionStat将被更新,并且在return紧随其后时永远不会读取,只需删除这些内容即可。pipePrefix检查使用神奇的数字8,就像下面的格式一样,使用PadRight --将这个数字设为常量,这样它们就不会失去同步。fillDataGridMillIns -我相信捕捉这些异常是最有用的事情。该块可以简化一点如果您使用的是C# 6或更高版本。https://codereview.stackexchange.com/questions/214324
复制相似问题