我正在Clojure中开发一个具有多个子结构的复杂数据结构.
我知道我会想要随着时间推移扩展这个结构,有时可能想要改变内部结构而不会破坏数据结构的不同用户(例如我可能想要将一个向量更改为一个hashmap,添加某种索引出于性能原因的结构,或者包含Java类型)
我目前的想法是:
我认为这会有效,但我担心它开始看起来像很多"胶水"代码.它也可能反映了我对面向对象方法的更多熟悉.
在Clojure中推荐的方法是什么?
class my_class
{
public int add_1(int a, int b) {return a + b;}
public func<int, int, int> add_2 = (a, b) => {return a + b;}
}
Run Code Online (Sandbox Code Playgroud)
add_1是一个函数,而add_2是一个委托.然而,在这种情况下,代表们可以填补类似的角色.
由于先例和语言的设计,C#方法的默认选择应该是函数.
然而,这两种方法都有利有弊,所以我已经制作了一份清单.这两种方法都有任何优点或缺点吗?
传统方法的优点.
"委托类型字段"方法的优点.
有没有办法模块化SQL代码,以便更具可读性和可测试性?
我的SQL代码经常变成一系列复杂的嵌套连接,内部连接等,难以编写且难以调试.相比之下,在诸如Javascript或Java之类的过程语言中,人们会将离散元素作为单独的函数来捏合,这些函数将按名称调用.
是的,可以将每个查询作为完全独立的查询,存储在数据库中或作为存储过程编写,但通常我不想更改/混乱数据库,只是查询它很好,特别是如果DBA不希望授予所有用户写入权限.
例如,从概念上讲,复杂查询可能很容易用伪代码描述,如下所示:
(getCustomerProfile)
left join
(getSummarizedCustomerTransactionHistory)
using (customerId)
left join
(getGeographicalSummaries)
using (region, vendor)
...
Run Code Online (Sandbox Code Playgroud)
我意识到从理论上看有很多关于这个主题的文章(下面的几个链接),但我只是想找到一种方法来使代码更容易正确编写,并且一旦编写就更容易阅读.也许只是语法糖来从视觉中抽象出复杂性,如果不是从执行中,那么在我试图不看的文字SQL中编译.类推...
如果特定的SQL风格很重要,我的大部分工作都在PostgresQL中.
我正在阅读这篇文章,关于承诺抽象的部分对我来说似乎有点过于复杂.以下是一个例子:
requestSomeData("http://example.com/foo") // returns a promise for the response
.then(function(response){ // ‘then’ is used to provide a promise handler
return JSON.parse(response.body); // parse the body
}) // returns a promise for the parsed body
.then(function(data){
return data.price; // get the price
}) // returns a promise for the price
.then(function(price){ // print out the price when it is fulfilled
print("The price is " + price);
});
Run Code Online (Sandbox Code Playgroud)
在我看来,以下可以用更少的代码行提供相同的结果:
requestSomeData("http://example.com/foo")
.requestHandler(function(response){
// parse the body
var data = JSON.parse(response.body);
// …Run Code Online (Sandbox Code Playgroud) 导入某些数据类型时,需要将(..)用于导入构造函数.
是否可以阻止导出某些数据类型的构造函数,即使导出该数据类型也是如此?
我已经阅读了命令模式,我想我错过了一些东西.Command对象的存在是为了抽象出Receiver对象的细节.在我看来,我们可以简单地停在这里,并保持对Command对象的引用,以在适当的时间执行适当的方法.
那么,为什么需要Invoker呢?这种额外的间接提供了什么优势?我们已经隐藏了命令后面的接收器的细节,那么命令随后被客户端隐藏的动机是什么?
abstraction information-hiding design-patterns command-pattern
我想创建一个具有初始行为的AbstractComponent,同时能够在需要时覆盖它,可能吗?这是一个好习惯吗?
应该看起来或多或少那样:
export abstract class AbstractComponent implements OnInit {
constructor(authService: AuthService, router: Router) {}
ngOnInit() {
if (authService.userNotLoggedInAnymore()) {
router.navigate(['Login']);
}
}
...
}
Run Code Online (Sandbox Code Playgroud) 抽象这种模式的最佳方法是什么:
class MyClass
attr_accessor :foo, :bar
def initialize(foo, bar)
@foo, @bar = foo, bar
end
end
Run Code Online (Sandbox Code Playgroud)
一个好的解决方案应该考虑超类,并且能够处理仍然能够使用初始化程序来执行更多操作.在您的解决方案中不牺牲性能的额外要点.
抽象是一个似乎难以解释的概念,而不回复使用编程术语.我已经考虑了很多,但我无法得出满意的答案.有没有人有任何非常一般但非常相关的解释?
隐喻,similes等都是受欢迎的.
例:
迭代器是纯粹的抽象:任何行为类似于迭代器的东西都是迭代器.
这是什么意思?