如何用设计模式去除ifelse多重嵌套?

jlennonxzy 2021-02-22 08:55:05
winform程序,感觉ifelse嵌套有点多了,如何用状态模式去除ifelse嵌套,请高手指教,谢谢。
        private void UploadBtn_Click(object sender, EventArgs e) {
if (string.IsNullOrWhiteSpace(ScanTbx.Text)) return;
string text = ScanTbx.Text.Trim();
using (var connection = SqlCon.TestDbConnection()) {
/***********************************************************************/
if (!next) {
if (LuhnAlgorithm.IsValidNumber(text)) {
string imei = $"select * from Binding where IMEI='{text}'";
var imeiQuery = connection.Query<Binding>(imei).ToList();
if ((imeiQuery.Count == 0) || cbxEdit865Code.Checked) {
lblIMEI.Text = text;
next = !next;
label1.Text = "请扫描小条码";
}
else {
MessageBox.Show("IMEI已扫描", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
}
}
else {
MessageBox.Show("IMEI错误", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
}
}
/***********************************************************************/
else {
if (cbxEditCode.Checked) {
string editSN = $"update Binding set SN='{text}' where IMEI='{lblIMEI.Text}'";
var sqlUpdateSN = connection.Execute(editSN);
if (sqlUpdateSN > 0) {
next = !next;
label1.Text = "请扫描大I条码";
lblIMEI.Text = "";
cbxEdit865Code.Checked = false;
/*********************************/
string query = "select * from Binding order by BindingDate desc";
var sqlQuery = connection.Query<Binding>(query).ToList();
dataGridView1.DataSource = sqlQuery;
}
else {
MessageBox.Show("修改失败", "提示", MessageBoxButtons.OK,
MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
}
}
else {
string sn = $"select * from Binding where SN='{text}'";
var snQuery = connection.Query<Binding>(sn).ToList();
if (snQuery.Count == 0) {
string insert = $"insert into Binding (IMEI,SN) values(" +
$"'{lblIMEI.Text}','{text}')";
var sqlInsert = connection.Execute(insert);
if (sqlInsert > 0) {
next = !next;
label1.Text = "请扫描大条码";
lblIMEI.Text = "";
/*********************************/
string query = "select * from Binding order by BindingDate desc";
var sqlQuery = connection.Query<Binding>(query).ToList();
dataGridView1.DataSource = sqlQuery;
}
else {
MessageBox.Show("绑定失败", "提示", MessageBoxButtons.OK,
MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
}
}
else {
MessageBox.Show("小条码已扫描", "提示", MessageBoxButtons.OK,
MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
}
}
}
}
ScanTbx.Clear();
ScanTbx.Focus();
return;
}
...全文
282 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
jlennonxzy 2021-02-24
  • 打赏
  • 举报
回复
@Denuin 谢谢指教。
Denuin 2021-02-24
  • 打赏
  • 举报
回复
现在不是已经挺好的吗?100行代码都不够,程序能跑,小白也能看懂而且调试起来也方便。如果要改的话,稍微整理一下代码就OK了,例如把原来的切分成小函数让主逻辑清晰一点,或者相同代码抽出来等等

private void UpdateDataGridView1(???  connection)
{
	string query = "select * from Binding order by BindingDate desc";
	var sqlQuery = connection.Query<Binding>(query).ToList();
	dataGridView1.DataSource = sqlQuery;
}

private bool HasBinding(???  connection, string where)
{
	string sn = $"select * from Binding where {where}";
	var snQuery = connection.Query<Binding>(sn).ToList();
	return (snQuery.Count > 0)
}

jlennonxzy 2021-02-24
  • 打赏
  • 举报
回复
@你说的很对,我就是不理解模式,无法抽象出,所以每个方法都是一大堆。
  • 打赏
  • 举报
回复
其实乱拼凑代码(例如“next”这类代码)的人是无法理解规范和模式的。模式在拼凑代码之外,是通过画图,通过将静态数据结构的各部分分散、关联,将动态的状态可以图形化分析设计,将逻辑计算功能职责随着数据结构的一般化和扩展化而分布到不同的Class中去执行,将UI与代码彻底分离,等等方式来“设计”而不是为了省点儿事儿去写代码。实际上为了省事儿,往往写出来的代码将来的bug不断,别人3天干好的事情他(她)用6个月也干不好只能勉强应付。 描述代码的逻辑能够等多个不同设计角度描述,文档化描述,清晰的和分层的逻辑设计,每一层每一个方法只有简单的3、4句话。而不是只会扔代码细节来描述。
  • 打赏
  • 举报
回复
如果要学究点儿说,所谓模式化分支判断,就是使用“扩展、分类、继承”的机制来设计类型系统,将属于父类的业务逻辑在父类完成,子类只是书写一些必须要写的对父类的差别(abstract)的部分。但是基础是,你有逻辑编程训练,能把100行代码总结为4、5行代码,会分层,是“程序设计师”。
  • 打赏
  • 举报
回复
先把你的主要方法缩小到20行代码以内。用啥“设计”模式?
圣殿骑士18 2021-02-23
  • 打赏
  • 举报
回复
1、3段判断,封装成3个方法后,再调用 2、3段判断,封装成3个匿名委托,再调用 3、使用return解套 if (...) { } else { if (...) { } else { } } 改为: if (...) { ... return; } if (...) { ... } ...
qq_30412191 2021-02-23
  • 打赏
  • 举报
回复
Hi ,首先 你可以百度一下三层架构的基本纪念,其中你这段代码涉及到了几点不好的地方. 1.验证和动作是两个不同的概念,你起码要注意分开。 2.本质页面操作和验证也是不同的,为了代码解构也不要写在一起,但是如果同事代码水平比较低的话,或者不在进行后续,这种没什么大问题。 3.我给你一套简单的验证体系来确保能有效的减少if else 代码如下:

      public static void SnCheck()
        {
            //如何进行验证?
            string sn = Console.ReadLine();
            Request request = new Request()
            {
                Sn = sn
            };
            //调用 bll进行逻辑验证
            string msg = bll.CheckSn(request);
            if (string.IsNullOrEmpty(msg))
            {
                SuccessMSG("成功请刷别的材料");
            }
            else
            {
                ErrorMSG(msg);
            }
        }
         public interface IValidate
    {
        string Validate(Request t, object help);
    }
   
    public static class ListExtend
    {
        /// <summary>
        /// 通用验证 输入参数要求request
        /// </summary>
        /// <param name="list"></param>
        /// <param name="t"></param>
        /// <param name="t2"></param>
        /// <returns></returns>
        public static string ValidateCheck(this List<IValidate> list, Request t, object t2)
        {
            string msg = "";
            foreach (var item in list)
            {
                msg = item.Validate(t, null);
                //不等于null 或空,表示验证失败,验证失败返回结果
                if (!string.IsNullOrEmpty(msg)) return msg;
            }
            return msg;
        }
 public class SnCheckValidateMain
    {
       public static string Main(Request requst, object t)
       {
           List<IValidate> list = new List<IValidate>();
           list.Add(new SnCheckLength());///检查sn长度是否合法
           list.Add(new SnCheckGroup());///检查sn的当前站别是否存在
           list.Add(new SNcheckCustomer());///检查sn的客户别是否正确
       
           return list.ValidateCheck(requst, null);
       }

    }
  
大致验证逻辑如下,希望能对你有所帮助
晨易夕 2021-02-23
  • 打赏
  • 举报
回复
你都知道用状态模式了,你就为你的类设计状态啊。
兔子-顾问 2021-02-23
  • 打赏
  • 举报
回复
private void UploadBtn_Click(object sender, EventArgs e) {
    if (string.IsNullOrWhiteSpace(ScanTbx.Text)) return;
    string text = ScanTbx.Text.Trim();
    using (var connection = SqlCon.TestDbConnection()) {
        /***********************************************************************/
        if (!next) {
            if (!LuhnAlgorithm.IsValidNumber(text)) {
                MessageBox.Show("IMEI错误", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                return;
            }
            string imei = $"select * from Binding where IMEI='{text}'";
            var imeiQuery = connection.Query<Binding>(imei).ToList();
            if (!((imeiQuery.Count == 0) || cbxEdit865Code.Checked)) {
                MessageBox.Show("IMEI已扫描", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                return;
            }
            lblIMEI.Text = text;
            next = !next;
            label1.Text = "请扫描小条码";
        }
        /***********************************************************************/
        else {
            if (cbxEditCode.Checked) {
                string editSN = $"update Binding set SN='{text}' where IMEI='{lblIMEI.Text}'";
                var sqlUpdateSN = connection.Execute(editSN);
                if (sqlUpdateSN <= 0) {
                    MessageBox.Show("修改失败", "提示", MessageBoxButtons.OK,
                        MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                    return;
                }
                next = !next;
                label1.Text = "请扫描大I条码";
                lblIMEI.Text = "";
                cbxEdit865Code.Checked = false;
                /*********************************/
                string query = "select * from Binding order by BindingDate desc";
                var sqlQuery = connection.Query<Binding>(query).ToList();
                dataGridView1.DataSource = sqlQuery;
            }
            else {
                string sn = $"select * from Binding where SN='{text}'";
                var snQuery = connection.Query<Binding>(sn).ToList();
                if (snQuery.Count != 0) {
                    MessageBox.Show("小条码已扫描", "提示", MessageBoxButtons.OK,
                            MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                    return;
                }
                string insert = $"insert into Binding (IMEI,SN) values(" +
                        $"'{lblIMEI.Text}','{text}')";
                var sqlInsert = connection.Execute(insert);
                if (sqlInsert <= 0) {
                    MessageBox.Show("绑定失败", "提示", MessageBoxButtons.OK,
                            MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                    return;
                }
                next = !next;
                    label1.Text = "请扫描大条码";
                    lblIMEI.Text = "";
                    /*********************************/
                    string query = "select * from Binding order by BindingDate desc";
                    var sqlQuery = connection.Query<Binding>(query).ToList();
                    dataGridView1.DataSource = sqlQuery;
            }
        }
    }
    ScanTbx.Clear();
    ScanTbx.Focus();
    return;
}
兔子-顾问 2021-02-23
  • 打赏
  • 举报
回复
可以换个思路写 if(xxxx) { //执行代码 } else { //弹出提示,并退出方法 } 改进为: if(!xxx) { //弹出提示,并退出方法 } //这里就是true的代码,就可以少一层缩进,代码更简练。

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧