首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >铣削作业表单的验证和业务逻辑

铣削作业表单的验证和业务逻辑
EN

Code Review用户
提问于 2019-02-26 14:43:42
回答 2查看 107关注 0票数 2

我有以下BLL (业务逻辑层)类。这是我创建的第一个类,它从UI (其中这个类被实例化/创建/调用)根据业务规则取消了所有的责任。此代码的目标是在需要添加控件或字段并插入到数据库的情况下具有可重用性和灵活性。

代码语言:javascript
复制
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;
        }
    }
}
EN

回答 2

Code Review用户

回答已采纳

发布于 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年;
  • 不一致的变量命名约定。您将看到用于局部变量的camelCase多于PascalCase (例如,pipeSize而不是PipeSize)。
  • 奇怪的输入代码。当插入新的..。不管您要插入什么(在foreach (var pipe in pipes)循环中),您都要传递一串字符串参数。考虑创建一个类来表示要插入的内容,并使用适当的数据类型。例如,直径很可能是decimal而不是string
  • 不必要的MillInsController实例化。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}
票数 3
EN

Code Review用户

发布于 2019-02-27 00:04:37

我只想在前面提到的建议之外补充一些意见:

  • 如果有任何方法可以合并自动布局和某种类型的声明性UI,或者使用UI构建器,那么像InputBox这样的方法可能会容易一些:繁琐的事情应该由机器(嗯,计算机)来完成。此外,在许多情况下,这还允许您在保持比例等的同时更容易地重新分配窗口和对话框。也就是说,当我输入FlowLayoutPanel这个职位时,搜索中会弹出TableLayoutPanelwinforms
  • if (x == false) ... --这只是if (!x)... == true --这只是...本身,不需要与truefalse相比。
  • 错误消息似乎并没有给用户提供太多的上下文。比如,如果已经有了检查,那么只需告诉用户检查到底出了什么问题,否则他们仍然需要查阅手册、程序员或同事吗?而真正被检查的真相的来源就在那里!例如,它不需要说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或更高版本
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/214324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档