我们需要一种全新的语法来解决传统编程中的问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了我们需要一种全新的语法来解决传统编程中的问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4155字,纯文字阅读大概需要6分钟。
内容图文
我们需要一种全新的语法来解决传统编程中的问题
要解决什么问题
本文论述一种解决单例滥用问题、组件间交流问题的方法,并提出一种语法来解决它们。但当前并没有语言支持它。
单例的滥用
单例是一种比较常见的程序设计模式,有时通过静态成员来实现。通常会在用户界面以及对硬件的操作上较多的使用单例,但也带来了潜在的滥用问题,会导致例如在多硬件环境无法有效利用硬件等。
组件间交流
组件的执行需要获取某些数据,但在当前的组件中并没有保存这些数据,并且组件需要的数据可能会随着开发而更改。为了解决这个问题通常会定义一个上下文(Context)结构,并将上下文结构传递给组件。当组件需要的数据增加时只需增加上下文的成员即可。但是在实际开发中通常存在许多不同的上下文,并且需要为每一个上下文建立一个类型或结构体,这增加了代码的长度,也给修改代码带来了麻烦。
新的语法应该是什么样的
以C#为例,假如我们要改进C#语法,我们应当增加context关键字,此关键字可以用于成员的声明。也可以在形参中使用,类似ref和out。也可以修饰函数。
先看修饰形参和成员。
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();
}
}
在此代码中,我们对使用单例的代码稍加改造,就实现了单例的去除。
那么有哪种语言支持它吗
目前没有。
内容总结
以上是互联网集市为您收集整理的我们需要一种全新的语法来解决传统编程中的问题全部内容,希望文章能够帮你解决我们需要一种全新的语法来解决传统编程中的问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。