首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >带空检查的c#重构开关语句

带空检查的c#重构开关语句
EN

Stack Overflow用户
提问于 2016-04-15 01:22:04
回答 5查看 679关注 0票数 3

我只是有点麻烦,几个开关声明真的,我觉得有一个更好的方式来实现最终目标。

从本质上说,我是将视图模型传递到一个方法中。该方法首先从数据库中检索视图模型所涉及的对象,然后由switch语句对特定属性执行空检查。基于该结果,另一条switch语句将对视图模型执行另一次空检查。在每个点从数据库中将值分配给对象,然后在结束时进行数据库更新。

这是代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        public async Task UpdateContractWithRepository(ViewModel viewModel)
    {
        // Get the contract from db
        Contract contract = GetContract(viewModel.Id);

        switch (viewModel.RepositoryId == null)
        {
            case true:
                switch (contract.RepositoryId == null)
                {
                    case true:
                        // nothing to do
                        // no change
                        break;
                    case false:
                        // Unassign Repository
                        UpdateRepositoryAssignment(contract.RepositoryId, false);

                        // Update properties
                        contract.RepositoryId = null;
                        contract.ConsumedUnits = null;
                        break;
                }
                break;
            case false:
                switch (contract.RepositoryId == null)
                {
                    case true:
                        // assign repository
                        UpdateRepositoryAssignment(viewModel.RepositoryId, true);

                        // Get repository
                        Repository repository = GetRepository(viewModel.RepositoryId);

                        // Update properties
                        contract.RepositoryId = repository.Id;
                        contract.ConsumedUnits = repository.Units;
                        break;
                    case false:
                        // assign repository
                        UpdateRepositoryAssignment(viewModel.RepositoryId, true);

                        // Get repository
                        Repository repository = GetRepository(viewModel.RepositoryId);

                        // Update properties
                        contract.RepositoryId = repository.Id;
                        contract.ConsumedUnits = repository.Units;
                        break;
                }
                break;

        }

        UpdateContract(contract);
    }

我想我也许可以取消开关语句,转而使用if语句,从我所能知道的情况来看,仍然会有一些嵌套。只是想知道有没有人有什么建议。

在这里,我已经看过重构开关语句,但它们似乎并没有真正涵盖空检查。

任何帮助都是非常感谢的!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-04-15 01:31:50

只要去掉两个bools,整个代码就可以简化:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bool IsVMRepoNull = viewModel.RepositoryId == null;
bool IsContractRepoNull = contract.RepositoryId == null;

if(IsVMRepoNull && !IsContractRepoNull )
{
  UpdateRepositoryAssignment(contract.RepositoryId, false);

 // Update properties
  contract.RepositoryId = null;
  contract.ConsumedUnits = null;
}
else if(!IsVMRepoNull)
{
  UpdateRepositoryAssignment(viewModel.RepositoryId, true);

  // Get repository
  Repository repository = GetRepository(viewModel.RepositoryId);

  // Update properties
  contract.RepositoryId = repository.Id;
  contract.ConsumedUnits = repository.Units;
}
票数 1
EN

Stack Overflow用户

发布于 2016-04-15 01:28:53

我不完全确定您的位置--但是用if/else替换开关就像用if替换switch一样简单。以下是转换后的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public async Task UpdateContractWithRepository(ViewModel viewModel)
{
    // Get the contract from db
    Contract contract = GetContract(viewModel.Id);

    if (viewModel.RepositoryId == null)
    {
        if (contract.RepositoryId == null)
        {
            // nothing to do
            // no change
        } else {
            // Unassign Repository
            UpdateRepositoryAssignment(contract.RepositoryId, false);

            // Update properties
            contract.RepositoryId = null;
            contract.ConsumedUnits = null;
        }
    } else {
        if (contract.RepositoryId == null)
        {
            // assign repository
            UpdateRepositoryAssignment(viewModel.RepositoryId, true);

            // Get repository
            Repository repository = GetRepository(viewModel.RepositoryId);

            // Update properties
            contract.RepositoryId = repository.Id;
            contract.ConsumedUnits = repository.Units;
        } else {

            // assign repository
            UpdateRepositoryAssignment(viewModel.RepositoryId, true);

            // Get repository
            Repository repository = GetRepository(viewModel.RepositoryId);

            // Update properties
            contract.RepositoryId = repository.Id;
            contract.ConsumedUnits = repository.Units;
        }
    }

    UpdateContract(contract);
}
票数 1
EN

Stack Overflow用户

发布于 2016-04-15 01:30:06

我认为没有必要这么复杂。试试看,我认为它的作用是一样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public async Task UpdateContractWithRepository(ViewModel viewModel){
        Contract contract = GetContract(viewModel.Id);

        if (viewModel.RepositoryId == null)
        {
            if(contract.RepositoryId != null){
                UpdateRepositoryAssignment(contract.RepositoryId, false);
                contract.RepositoryId = null;
                contract.ConsumedUnits = null;
            }
        }
        else
        {
            if (contract.RepositoryId == null)
            {
                UpdateRepositoryAssignment(viewModel.RepositoryId, true);
                Repository repository = GetRepository(viewModel.RepositoryId);
                contract.RepositoryId = repository.Id;
                contract.ConsumedUnits = repository.Units;
            }
            else
            {
                UpdateRepositoryAssignment(viewModel.RepositoryId, true);
                Repository repository = GetRepository(viewModel.RepositoryId);
                contract.RepositoryId = repository.Id;
                contract.ConsumedUnits = repository.Units;
            }
        }
        UpdateContract(contract);
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36643203

复制
相关文章
盘点JavaScript中的Iterable object(可迭代对象)
可迭代(Iterable) 对象是数组的泛化。这个概念是说任何对象都可以被定制为可在 for..of 循环中使用的对象。
前端进阶者
2021/09/10
1.7K0
盘点JavaScript中的Iterable object(可迭代对象)
探索Python中的迭代器(Iterator)和可迭代对象(Iterable)
在Python编程中,迭代器(Iterator)和可迭代对象(Iterable)是两个重要的概念。它们为我们提供了一种简洁而有效的方式来处理数据集合,同时也是深入理解Python语言内部机制的关键。本文将深入探讨迭代器和可迭代对象的概念、工作原理以及在实际代码中的应用。
疯狂的KK
2023/10/08
3260
探索Python中的迭代器(Iterator)和可迭代对象(Iterable)
Python中的迭代协议(iteration protocol)和可迭代对象(iterable)的概念
在Python中,迭代是一种非常常见的操作,它允许我们遍历数据集合中的每个元素。为了实现迭代功能,Python引入了迭代协议(iteration protocol)和可迭代对象(iterable)的概念。本文将详细解释这两个概念,并给出相应的代码示例。
疯狂的KK
2023/08/03
3590
Python中的迭代协议(iteration protocol)和可迭代对象(iterable)的概念
[Python]生成器generator,可迭代Iterable和迭代器Iterator
[Python]生成器generator,可迭代Iterable和迭代器Iterator
祥知道
2020/03/10
7010
迭代(iterable)和迭代器
简介: 迭代(iterable) #任何可迭代对象都可以作用于for循环,包括我们自定义的数据类型,只要符合迭代条件,就可以使用for循环 d = {'a': 1, 'b': 2, 'c': 3} #对dict迭代 for k,v in d.
狼啸风云
2020/07/06
8530
精读《迭代器 Iterable》
本周精读的文章是 Iterables 与 Iteration protocols,按照为什么需要迭代器、迭代器是如何设计的,我们还能怎么利用迭代器展开来讲。
黄子毅
2022/11/21
2730
Python 迭代器 - Iterable对象
迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
Devops海洋的渔夫
2019/06/02
2.1K0
一文彻底搞懂Python可迭代(Iterable)、迭代器(Iterator)和生成器(Generator)的概念
在Python中可迭代(Iterable)、迭代器(Iterator)和生成器(Generator)这几个概念是经常用到的,初学时对这几个概念也是经常混淆,现在是时候把这几个概念搞清楚了。
阳仔
2019/08/01
6.1K0
[Python]迭代和对象的可迭代性
Python文档整理目录: https://blog.csdn.net/humanking7/article/details/80757533
祥知道
2020/03/10
1.1K0
【前端】iterable类型的 forEach方法
zhaokang555
2023/10/17
880
on方法多次绑定会多次执行的解决方法
当重复使用on方法为一个元素绑定事件时,这个事件不会覆盖而是会叠加; 例如 for(var i=0;i<5;i++) $('#test').on('click',function(){ console.log(1); }) 这样的话,只要点击test元素,将会在控制台生成5个1 解决方法为遇到这种情况需要在每次绑定事件之前,对该事件解绑,也就是 $(“#test”).off(“click”); ,off方法解绑。
仙士可
2019/12/18
1.1K0
【Java】Collection遍历使用Iterable迭代器
package com.example.demo.test; import java.util.Arrays; import java.util.Iterator; import java.util.List; /** * @Author bennyrhys * @Date 9/1/21 11:48 PM * Iterable随机数生成器 */ public class RandomString<T> implements Iterable{ private final List<T
瑞新
2021/12/06
4690
Python可迭代的对象与迭代器的对比
什么是迭代?迭代是指按需一次获取一个数据。是否可以迭代,可以通过是否可以使用for循环取值来进行简单的判断。更准确的判断是使用iter()函数,这是一个Python内置函数。
dongfanger
2021/11/30
1.6K0
MySQL 的可重复读
我在这里分享一篇关于 MySQL 的可重复读介绍,讲得挺好的,可以解决一些疑惑,链接在下方引用处。
RendaZhang
2020/09/08
1.8K0
MySQL 的可重复读
可迭代对象、迭代器、生成器的理解
该文章介绍了如何利用Python的yield关键字、生成器表达式、迭代器协议和自定义类实现一个简单的生成器。生成器是一种特殊的迭代器,它可以用来生成一系列值,并且可以在需要时动态生成值。生成器可以通过yield关键字来暂停和恢复其执行状态,这样可以避免重复生成值。生成器还可以通过生成器表达式来创建,它可以用来生成一个不可变的序列。
coders
2018/01/04
1.2K0
可迭代对象、迭代器、生成器的理解
java中Iterable接口的使用,实现一个单链表的迭代器
Iterable接口中需要实现的抽象方法iterator()的返回值会返回一个迭代器对象,这个迭代器对象可以作为一个工具来遍历集合类中的对象。此外,迭代器更是设计模式,如对图的遍历可以实现一个图迭代器,简化代码,将遍历的思想抽象出来。
lexingsen
2022/02/24
5950
java中Iterable接口的使用,实现一个单链表的迭代器
后端处理高并发状态的多次重复请求
  相信做Web的,都有可能遇到有多次重复请求发送到后端的情况。而这些重复请求,可能大都是由于在网络较差的情况下,用户多次连续点击。最后导致后端面临处理大量重复请求的境地。阻止这些情况发生的方法有很多。   比如在前端,可以设置当用户点击按钮之后,禁用按钮直到有结果返回。如果是用ajax发送请求,那么在发送请求之前,可以调用XMLHttpRequest的abort()函数,abort 函数是清除上一个XMLHttpRequest 重置为 readyState 为 0 的状态,并且取消所有未决的网络活动,等等
ShenduCC
2018/04/27
3.6K0
Pythonic:递归、回溯等5种方法生成不重复数字整数
问题描述:从0到9这10个数字任选3个不重复的数字,能构成哪些三位数? So easy!看到这样的问题,很多人会写出类似(注意,只是类似,我为了使得本文几个函数具有相同的调用形式,给demo1和demo2加了点多余的东西)下面这样的代码: def demo1(data, k=3): '''从data中选择不同的3个数字组成三位数''' assert k == 3, 'k must be 3' for i in data: if i == 0:continue ii = i*100
Python小屋屋主
2018/04/16
1.2K0
点击加载更多

相似问题

GitGraph -缩放图的大小

12

缩放窗口大小的div

35

图像不随窗口大小缩放

07

根据窗口大小和内容大小缩放iFrame

214

缩放不同大小的热图

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文