C#是否应该限制链式重载的设计模式?

这篇具有很好参考价值的文章主要介绍了C#是否应该限制链式重载的设计模式?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

知乎网友问

链式重载是我自己创造的一个词,意思是方法A里处理一下参数,return另一个方法A,第二个方法A里处理一下参数调第三个方法A,就这样无限循环下去直到调到真正能出结果的方法A。

本人学艺不精,偶然进行C#开发,感觉看代码要吐。比如看到某处调用方法A,除非有某个特征显眼的参数,否则根本不知道调的方法A是哪个,而且代码里也不是按照链的顺序写的。

 

我的回答

你说的链式重载是重载是有必须要的,准确说应该叫构造者设计模式。

 

1、代码的可阅读性

一眼看懂是什么意思,并且能看出生成的SQL是什么样的

   var list = db.Queryable<Student>()
             .GroupBy(it => it.Name)  
             .Where(it=>it.Id>0) 
             .Select(it => new { 
                          idAvg = SqlFunc.AggregateAvg(it.Id),
                          count = SqlFunc.AggregateCount(it.Id),  
                           name = it.Name })
             .ToList(); //此代码来自SqlSugar ORM

下面这么写可能就看不懂是什么意思,根看看不出哪个是条件哪个是分组

db.Query(it=>it.Name,
             it.Id>0,
             it => new { 
                          idAvg = SqlFunc.AggregateAvg(it.Id),
                          count = SqlFunc.AggregateCount(it.Id),  
                           name = it.Name })//看不懂什么意思

2、易编写和可扩展

如果不用链式重载下面参数越写越多,你让用的人怎么去调,光看这些重载眼睛都要看花,并且封装方法的人也不舒服,写的代码的人工作量也大大家都不舒服。

db.Query(group,where,select,orderby,page)
db.Query(group,where,select,orderby)
db.Query(group,where,select)
db.Query(group,where)
db.Query(group)

上面的还能接受下面的就破防了,因为链式重载函数的可以重复使用

//用链式重载可以有多次使用同一个参数
.OrderBy(it=>it.Id)
.OrderBy(it=>it.Name)
.OrderBy(it=>it.Price) 
//那你下面的代码怎么改没办法改了吧哈哈 
db.Query(group1,group2,group3,where1,where2,where3,orderby1,Orderby2,Orderby3........)

3、什么时候适合链式重载

一般95%参数的顺序没有要求的时候可以用链式重,意就是说

Where、OrderBy、Group这些函数的顺序没有要求的时候

 

总结:

使用链式是一有远见的设计方案,你要考虑到未来需求无限增长的情况

就拿EF Core来说只是查询用了链式重载,插入、更新和删除没有使用链式重载

这就导致他插入更新和删除功能受到了严重的限制, 下面的功能SqlSugar五年前就有了

EF Core8近期才免强支持,整整晚了五年

var result= db.Updateable<Student>()
.SetColumns(it => it.Num== it.Num+1)
.Where(it => it.Id == 1)
.ExecuteCommand();

SqlSugar正因设计的长远,使用了链式功能想怎么加就怎么加,SqlSuar在EF Core停滞的五年又加了很多功能 秀一下

//分页更新除低内存,可以自动调节最佳性能
db.Updateable(List<实体>).PageSize(1000).ExecuteCommand() 

//条件更新
db.Updateable<Order>()
              .SetColumnsIF(p!=null ,it => it.CreateTime == p.Value)
              .SetColumnsIF(X!=null ,it => it.X== X)
              .Where(it => it.Id == 11).ExecuteCommand();

//联表更新
var t= db.Updateable<Order>()
        .InnerJoin<Custom>((x, y) => x.CustomId == y.Id)
          .SetColumns((x, y) => new Order() { Name = y.Name, Price = y.Id })
          .Where((x, y) => x.Id == 1)
          .ExecuteCommand();

//批量 字段+list[i].字段
db.Updateable(list)
   PublicSetColumns(it => it.Price, "+") //set price=price+list[i].price
   .ExecuteCommand();

//字典集合更新
var dtList = new List<Dictionary<string, object>>();
dtList.Add(dt);
dtList.Add(dt2);
var t666 = db.Updateable(dtList).AS("student").WhereColumns("id").ExecuteCommand();

//无实体更新
db.Updateable<object>()
                .AS("Order")
                .SetColumns("name", 1)
                .Where("id=1").ExecuteCommand();

//导航更新,可以方便的指定更新层级
 db.UpdateNav(list)
  .Include(z1 => z1.Books) 
  .ThenInclude(z1 => z1.RoomList)
  .ExecuteCommand();

//分表更新
db.Insertable(data).SplitTable().ExecuteCommand(); 
//分表在分页更新
db.Insertable(data).SplitTable().PageSize(1000).ExecuteCommand(); 

  文章来源地址https://www.toymoban.com/news/detail-669493.html

到了这里,关于C#是否应该限制链式重载的设计模式?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【行为型设计模式】C#设计模式之观察者模式

    参考代码:

    2024年02月13日
    浏览(50)
  • C#设计模式之---外观模式

    外观模式(Facade Pattern)提供了一个简单且公用的接口去处理复杂的子系统,并且没有减少子系统的功能。降低子系统的复杂性,避免了客户与子系统直接链接,它也减少了子系统与子系统间的连接,每个子系统都有它的Facade模式,每个子系统采用Facade模式去访问其他子系统

    2024年02月16日
    浏览(55)
  • C#设计模式之策略模式

    策略模式在设计模式中属于对象行为型模式,它的意图是定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。策略模式使得算法可独立于使用它的客户而变化。 策略模式的图解如下所示: 本文通过一个简单的例子来向大家介绍C#如何使用策略模式。本文以出

    2024年02月03日
    浏览(31)
  • C#设计模式之---策略模式

    策略模式(Stragety Pattern)是一种对象行为模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是 “在美国交个人所得税” 和 “在中国交个人所得税” 就有不同的算税方法。策略模式提供了替代派生的子类,并

    2024年02月13日
    浏览(26)
  • C#设计模式之---原型模式

    原型模式(Prototype Pattern) 是用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式是一种创建型设计模式。也就是用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。C# 提供了 ICloneable 接口,用 C# 实现原

    2024年02月15日
    浏览(37)
  • 【结构型设计模式】C#设计模式之享元模式

    享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过尽可能共享对象来减少内存使用和提高性能。它将对象分为两种类型:内部状态(Intrinsic State)和外部状态(Extrinsic State)。内部状态是可以共享的,而外部状态是独立于享元对象的,并且在使用时需要注入。 使用

    2024年02月13日
    浏览(39)
  • c#设计模式-创建型模式 之 原型模式

    原型模式是一种创建型设计模式,它允许你复制已有对象,而无需使代码依赖它们所属的类。新的对象可以通过原型模式对已有对象进行复制来获得,而不是每次都重新创建。 原型模式包含如下角色: 抽象原型类:规定了具体原型对象必须实现的的 clone() 方法。 具体原型类

    2024年02月11日
    浏览(41)
  • C#设计模式之---迭代器模式

    迭代器模式(Iterator Pattern)是一种对象行为模式,提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。支持在聚集中移动游标,使得访问聚合中的元素变得简单,简化了聚集的接口,封装了聚合的对象。 迭代器模式还可以应用于对树结构的访

    2024年02月13日
    浏览(51)
  • C#设计模式之---享元模式

    享元模式(Flyweight Pattern)是一种结构型模式,是运用共享技术有效的支持大量细粒度的对象。它使用共享对象,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似对象;它适合用于只是因重复而导致使用无法令人接受的大量内存的大量对象。通常对象中的部分状态

    2024年02月16日
    浏览(35)
  • C#设计模式教程(11):外观模式

    外观模式(Facade Pattern)是一种常用的设计模式,其主要目的是提供一个统一的接口来访问子系统中的一群接口。外观模式定义了一个高层接口,让子系统更加容易使用。 外观模式(Facade Pattern)是一种常用的软件设计模式,它的主要目的是为了提供一个统一的接口,来访问

    2024年01月22日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包