美文网首页
{C#}算法.解耦

{C#}算法.解耦

作者: 码农猫爸 | 来源:发表于2021-06-23 09:04 被阅读0次

背景

  • 同时计算多个变量,容易产生代码耦合,使语义模糊且代码难以复用。

对策(亲测有效)

namespace AlgorithmDecoupling
{
    class Program
    {
        static void Main(string[] args)
        {
            var demo = new Demo();
            demo.Show();
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using static System.Console;

namespace AlgorithmDecoupling
{
    public abstract class Bracket
    {
        protected readonly string Fx;

        protected List<int>
            Lefts = new List<int>(), // 左括号位置清单
            Rights = new List<int>(); // 右括号位置清单

        public Bracket(string fx)
        {
            Fx = fx;
        }

        public void Show()
        {
            Split();

            string method = GetType().Name.ToLower()
                .Replace("bracket", "");
            WriteLine($"*** by {method} ***");
            WriteLine("- at= 0123456789X");
            WriteLine($"- fx= {Fx}");

            WriteLine($"index of left bracket are: ");
            WriteLine("- " + string.Join(",", Lefts));

            WriteLine($"index of right bracket are: ");
            WriteLine("- " + string.Join(",", Rights));

            WriteLine();
            ReadKey();
        }

        protected abstract void Split();
    }

    // 同时提取左右括号
    public class CouplingBracket : Bracket
    {
        public CouplingBracket(string fx) : base(fx) { }

        protected override void Split()
        {
            int at = -1;
            var symbols = new char[] { '(', ')' };

            while (at < Fx.Length)
            {
                at = Fx.IndexOfAny(symbols, ++at);
                if (at == -1) break;

                var indexes = Fx[at] == '('
                    ? Lefts
                    : Rights;
                indexes.Add(at);
            }
        }
    }

    // 分步提取左右括号
    public class DecouplingBracket : Bracket
    {
        public DecouplingBracket(string fx) : base(fx) { }

        protected override void Split()
        {
            Lefts = _Locate('(');
            Rights = _Locate(')');

            // 实现了代码重用
            List<int> _Locate(char search)
                => Fx.Select((x, index) => x == search ? index : -1)
                    .Where(at => at >= 0)
                    .ToList();
        }
    }

    public class Demo
    {
        public void Show()
        {
            string fx = "(a+b)*(c-d)";

            var coupling = new CouplingBracket(fx);
            coupling.Show();

            var decoupling = new DecouplingBracket(fx);
            decoupling.Show();
        }
    }
}

相关文章

  • {C#}算法.解耦

    背景 同时计算多个变量,容易产生代码耦合,使语义模糊且代码难以复用。 对策(亲测有效)

  • 解耦

    解耦 对于大型重构, 最有效的手段就是 解耦, 解耦的目的使实现代码高聚合、松耦合。 解耦为何如此...

  • 20171127-03问题整理

    总摘要: 解耦. 接口降低. 架构. 2017-11-27摘要: 解耦. 接口降低. 架构. 1.为什么说解耦的...

  • 解耦

    今天小董给大家做了一个关于DMTP的精彩演讲,DMTP种种优秀的特性令我们这些听众叹为观止。 为何DMTP具有如此...

  • 解耦

    利用配置文件实现解耦 存在一个接口B 有3个实现类B1、B2、B3 在A类方法中需要调用B类实现代码: 此情况下,...

  • DDD 中的事件总线 (一)

    DDD 为什么需要event bus? 简单的说就是 解耦 ,无论是本地聚合间的解耦,还是微服务间的解耦. 没有e...

  • STL漫谈

    TraitsIterator是STL的核心思想。Iterator是把针对容器的算法与容器的具体实现分离、解耦的设计...

  • 策略模式,是如何解耦算法的?

    策略模式,是对谁和谁的解耦? 策略模式,怎么用? 策略模式(Strategy Pattern),定义了一系列算法并...

  • AFNetworking源码之AFAutoPurgingImag

    AFAutoPurgingImageCache图片缓存 通过2个protocol解耦,通过协议继承来解耦。协议相当...

  • iOS三方框架之 - AFNetworking的Https认证流

    对AFNetworking进行解耦AFNetworking解耦后可以分为以下几个模块:1. NSURLSessio...

网友评论

      本文标题:{C#}算法.解耦

      本文链接:https://www.haomeiwen.com/subject/ntkwyltx.html