ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

我们需要一种全新的语法来解决传统编程中的问题

2020-06-10 19:41:43  阅读:197  来源: 互联网

标签:全新 编程 public 语法 class D3dDevice context Methon void


我们需要一种全新的语法来解决传统编程中的问题

要解决什么问题

本文论述一种解决单例滥用问题、组件间交流问题的方法,并提出一种语法来解决它们。但当前并没有语言支持它。

单例的滥用

单例是一种比较常见的程序设计模式,有时通过静态成员来实现。通常会在用户界面以及对硬件的操作上较多的使用单例,但也带来了潜在的滥用问题,会导致例如在多硬件环境无法有效利用硬件等。

组件间交流

组件的执行需要获取某些数据,但在当前的组件中并没有保存这些数据,并且组件需要的数据可能会随着开发而更改。为了解决这个问题通常会定义一个上下文(Context)结构,并将上下文结构传递给组件。当组件需要的数据增加时只需增加上下文的成员即可。但是在实际开发中通常存在许多不同的上下文,并且需要为每一个上下文建立一个类型或结构体,这增加了代码的长度,也给修改代码带来了麻烦。

新的语法应该是什么样的

以C#为例,假如我们要改进C#语法,我们应当增加context关键字,此关键字可以用于成员的声明。也可以在形参中使用,类似refout。也可以修饰函数。

先看修饰形参和成员。

class class1
{
    context int config1 = 1;
    context class2 member2;
    
}
class class2
{
    public void Methon(context int config1)
    {
        if(config1 == 1)
        dosomething();
    }
}

调用约定:当形参名等同于context成员时,需要省略参数。

class class1
{
    context int config1 = 1;
    context class2 member2;
    
    public void Methon()
    {
        member2.Methon();
    }
}
class class3
{
    class2 member2;
    public void Methon1()
    {
        member2.Methon(1);
    }
    public void Methon2()
    {
        context int config1 = 1;
        member2.Methon();
        member2.Methon();
    }
}

通过context关键字的使用,我们可以简化函数的调用过程。当然这个语法的真正意义并不在此。

规定使用context修饰的函数A的实现在调用含有context形参的函数时可以不填充context修饰的实参。然后在函数B调用函数A时需要配置上下文。如果函数B未能配置上下文则可以继续使用context修饰函数B,这样我们就可以把数据从上层传递给下层,或者让下层把数据发给上层,无论经过多少中间层。

class class4
{
    class2 member2;
    public context void Methon()
    {
        member2.Methon();
    }
}
class class5
{
    class4 member;
    public void Methon()
    {
        context int config1 = 1;
        member.Methon();
    }
}

它是怎么解决问题的

单例去除

很显然,这种语法为函数调用的上下层开辟了一个通道,避免了中间过程的阻塞,减少了传递函数参数的个数。

这种语法可以解决一部分代码中的单例滥用问题。先来看个滥用例子。

public class D3dDevice
{
    public static D3dDevice instance;
    public static D3dDevice GetInstance()
    {
        return instance;
    }
    public void DoSomething()
    {
    }
}
public class ClassA
{
    ClassB member1;
    public void onl oad()
    {
        D3dDevice.instance=new D3dDevice();
    }
    public void OnDeviceLost()
    {
        D3dDevice.instance=new D3dDevice();
    }
    public void Loop()
    {
        member1.Methon();
    }
}

public class ClassB
{
    public ClassC member1;
    public void Methon()
    {
        member1.Methon();
    }
}
public class ClassC
{
   public void Methon()
   {
       var d3dDevice=D3dDevice.GetInstance();
       d3dDevice.DoSomething();
   }
}

这个例子中A拥有B,而B拥有C,但是由于代码编写者的编程习惯,导致D3dDevice的数据不是由A传给B再传给C的,在逻辑上B和C也不需要持有指向D3dDevice的引用,因此代码编写者选择了使用单例来传递数据。但是这也造成了代码更新困难问题。如果代码编写者继续这么做,那么所有试图访问D3dDevive的代码都会从D3dDevice.GetInstance里获得。假设这是一个计算密集形应用,对于物理学和图形的计算都需要访问D3dDevice,但物理学和图形的计算可以分开进行。如果某一天项目突然想要支持使用多个D3dDevice,那么这种编程方法带来的弊端就显而易见了,整个代码完全无法使用第二个设备,或者是为支持第二个设备添加许多额外的代码,例如将一部分代码改为GetInstance2(),如果继续增加设备,可能还会将另一部分代码改为GetInstance3()或者是GetInstance(int number)以便支持更多的设备。

如果我们使用前文提到的context语法,则可以以一种比较优雅的方法解决这个问题。

public class D3dDevice
{
    public void DoSomething()
    {
    }
}
public class ClassA
{
    ClassB member1;
    List<D3dDevice> devices=new List<D3dDevice>();
    public void onl oad()
    {
        devices.Add(new D3dDevice());
    }
    public void OnDeviceLost()
    {
        devices=new List<D3dDevice>();
        devices.Add(new D3dDevice());
    }
    public void Loop()
    {
        context D3dDevice d3dDevice=device[0];
        member1.Methon();
    }
}
public class ClassB
{
    public ClassC member1;
    public context void Methon()
    {
        member1.Methon();
    }    
}
public class ClassC
{
    public void Methon(context D3dDevice d3dDevice)
    {
        d3dDevice.DoSomething();
    }
}

在此代码中,我们对使用单例的代码稍加改造,就实现了单例的去除。

那么有哪种语言支持它吗

目前没有。

标签:全新,编程,public,语法,class,D3dDevice,context,Methon,void
来源: https://blog.csdn.net/weixin_45908977/article/details/106612481

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有