如何确保重构后代码仍然有效(即变量名称更改后)?
在静态语言中,如果一个类被重命名但其他引用类不是,那么我将得到一个编译错误.
但是在动态语言中没有这样的安全网,如果你不够小心,你的代码可能会在重构期间中断.您可以使用单元测试,但是当您使用模拟时,很难知道名称的变化,因此,它可能没有帮助.
如何解决这个问题呢?
我熟悉CouchDB以及将其结果映射到Scala对象的想法,以及找到一些自然的方法来迭代它,立即出现.
但我发现使用CouchDB的json/document-centric/shchema-free方法,Ruby和Javascript等动态语言做得非常好.
用静态语言用Couch做任何事情的好方法吗?
即使可以在运行时编译C#代码,也不可能在当前范围中包含和运行生成的代码.相反,所有变量都必须作为显式参数传递.
与像Python这样的动态编程语言相比,人们永远无法真正复制完整的行为eval(如本例所示).
x = 42
print(eval("x + 1")) # Prints 43
Run Code Online (Sandbox Code Playgroud)
所以我的问题是(无论它是否真的有用;))是否可以通过使用反射来模拟.NET中的动态范围.
由于.NET为我们提供了Diagnostics.StackTrace允许我们检查调用方法的类,因此这个问题归结为以下内容:( 如何)可以可靠地访问调用方法的本地?
堆栈跟踪是否为我们提供了足够的信息来计算内存偏移量,或者托管代码中是否禁止这样做?
这样的代码是否有可能?
void Foo() {
int x = 42;
Console.WriteLine(Bar());
}
int Bar() {
return (int)(DynamicScope.Resolve("x")); // Will access Foo's x = 42
}
Run Code Online (Sandbox Code Playgroud) 接口(或所有方法抽象的抽象类)是静态类型语言(如C#,JAVA)中的强大武器.它允许以统一的方式使用不同的派生类型.设计模式鼓励我们尽可能地使用界面.
但是,在动态类型语言中,在编译时不会检查所有对象的类型.它们不必实现以特定方式使用的接口.您只需要确保它们定义了一些方法(属性).这使得接口不是必需的,或者至少不像在静态语言中那样有用.
典型的动态语言(例如ruby)是否具有接口?如果确实如此,那么拥有它有什么好处?如果没有,那么我们是否会失去许多需要界面的漂亮设计模式?
谢谢.
我还没有访问C#4.0预览版.但我很好奇,在下面的例子中调用重载方法时C#4.0运行时会做什么.它是否解决了泛型过载......或专门的过载问题.
public class Foo<T>
{
protected string BarImpl( T value ) { return "Bar(T) says: " + value.ToString(); }
protected string BarImpl( int value ) { return "Bar(int) says: " + value.ToString(); }
public string Bar( T value )
{
dynamic foo = this;
return foo.BarImpl( value );
}
}
public static void Main( string args[] )
{
var f = new Foo<int>();
Console.WriteLine( f.Bar( 0 ) );
}
Run Code Online (Sandbox Code Playgroud) c# overloading dynamic-language-runtime dynamic-languages c#-4.0
我有一个AS3对象:{p1:"..",p2:".."}我想创建另一个对象,该对象包含一个属性的第一个对象,该属性的名称由变量定义:
var propertyName:String = "myName";
var myObj = new Object();
myObj.something_that_creates_a_property_named_as_propertyName({p1:"..", p2:".."})
Run Code Online (Sandbox Code Playgroud)
它有意义吗?
Jon Skeet发布了这篇博文,其中他声称他将会问为什么语言的动态部分如此优秀.所以我以为我先发制人地问他:是什么让他们这么好?
您是否了解动态语言中的任何DDD工作?
当偏离面向企业的解决方案(谷歌搜索,包括C#,.NET,ASP和Java产生的结果少10倍)时,DDD的实用资源往往会大幅减少,但我实际上找不到DDD实现的单一示例用动态语言......
对于从静态语言(java/c#)移动到动态语言(如python)的人来说,最重要的是什么?
如何完成任务似乎很酷,但重命名方法,或添加/删除参数似乎有风险!
是为每种方法编写测试的唯一解决方案吗?