我想做一个像这样的功能.
例如:
function Logger() {
this.log = function(msg) {
console.log(msg);
}
}
Run Code Online (Sandbox Code Playgroud)
我想在功能/模块等中使用它,一切正常.但是浏览器中的默认控制台通常会给出fileName + lineNumber.
现在,当我抽象此功能,fileName而lineNumber不是在这里我把我的instance.log().因为它会说调用console.log的地方,而不是函数本身.
所以我的问题:
如何从我想要使用记录器的位置获取正确的信息?或者,请给我任何改进此功能的提示.
我可能会以错误的方式接近这一点,所以请原谅我的天真:
为了学习Clojure,我已经开始将我的OAuth客户端库移植到Clojure.我这样做是通过包装clj-http来实现的,就像我在Python库中包装Python Requests一样.到目前为止,这似乎工作得很好,我真的很高兴看到Clojure中的实现变得生动.
但是我遇到了一个问题:我计划支持OAuth 1.0和2.0,并将各自的功能分成两个文件:oauth1.clj和oauth2.clj.现在,每个文件理想情况下应该公开一组与HTTP谓词对应的函数.
(ns accord.oauth2)
...
(defn get
[serv uri & [req]]
((:request serv) serv (merge req {:method :get :url uri})))
Run Code Online (Sandbox Code Playgroud)
这些函数基本相同,实际上现在在oauth1.clj和oauth2.clj之间完全相同.我的第一反应是将这些函数移动到core.clj中,然后在相应的OAuth名称空间(oauth1,oauth2)中要求它们,以避免两次写入相同的代码.
只要我在文件中使用引用的函数,即oauth1.clj或oauth2.clj,这就没问题了.但是,假设我们想要使用这个库,因为我打算(这里是REPL,或者你的程序),如下所示:
=> (require '[accord.oauth2 :as oauth2]) ;; require the library's oauth2 namespace
...
=> (oauth2/get my-service "http://example.com/endpoint") ;; use the HTTP functions
Run Code Online (Sandbox Code Playgroud)
oauth2/get找不到var,因为单独将它拉入oauth2.clj中的命名空间似乎并没有公开它,好像它实际上在那个命名空间中一样.我不想用更多的功能包装它们,因为这基本上违背了目的; 函数是如此简单(它们只是包装一个request函数)我会在三个地方写它们,基本上,如果我这样做的话.
我确信我不是正确地在Clojure中使用命名空间,而且可能是习惯性地考虑抽象问题和代码共享的一般方法.
所以我想知道这个惯用解决方案是什么?我完全错误地采取了这种方式吗?
编辑:
这是问题的简化:https://gist.github.com/maxcountryman/5228259
请注意,目标是一次编写HTTP谓词函数.他们不需要特殊的派遣类型或类似的东西.他们已经很好了.问题是它们不会暴露于accord.oauth1或者accord.oauth2,accord.oauth2例如,当您的程序需要时.
如果这是Python的,我们可以只导入功能是这样的:from accord.core import get, post, put, ...为accord.oauth1和accord.oauth2,然后当我们使用accord.oauth1,我们将有机会获得所有这些进口的功能,例如模块 …
我对这个用例有一个普遍的问题:我有一个班级A.这个类有一个非抽象的方法doStuffCallback(),可以被覆盖,但并不是每个子类都需要.但是:我想确保如果方法被覆盖,则子类方法必须调用parents方法.
例:
abstract class A {
private function doStuff() {
$this->doStuffCallback();
}
protected function doStuffCallback() {
// IMPORTANT CODE HERE
}
}
class B extends A {
protected function doStuffCallback() {
parent::doStuffCallback(); // I want to enforce this because the parents method code is important
// ALSO IMPORTANT CODE
}
}
Run Code Online (Sandbox Code Playgroud)
因为重写的方法做同样的事情,为同一个责任定义两个方法和调用两个方法的私有帮助方法会非常难看.像这样:
abstract class A {
private function doStuff() {
$this->callDoStuffCallback();
}
private function callDoStuffCallback() {
$this->internalDoStuffCallback();
$this->doStuffCallback();
// This is VERY ugly
}
private function …Run Code Online (Sandbox Code Playgroud) 我看到过程中的抽象.我看到数据的抽象.
我看到抽象正在失去不重要的细节.
我看到抽象是给一组元素一个名称,并将它们视为一个单元.(但我不知道为什么这被认为是抽象的.所以,我需要澄清这一点)
我知道也有抽象级别,虽然这个名字意味着某些东西,但我没有一个实际的例子,我想不出一个我对抽象定义感到困惑的具体问题.
有人可以写一篇全面的文章吗?抓一点.有人可以给出全面的答案吗?
编辑: - 谢谢你的答案.但是,我一直在寻找一个普遍的答案.例如,我正在阅读一篇文章,其中程序被视为抽象.但是,这里的答案是关于C#和Java中的抽象类(直到现在.)再次感谢你.
我想将一个对象集合添加到arrayList,只有当特定属性不为null时.
我正在考虑扩展ArrayList并在子类中实现检查.
另一种方法是在将它放入Arraylist之前检查属性,但这意味着,如果我需要根据逻辑将对象添加到arraylist,我必须分散if检查每个位置.
我想知道你对它的看法......再想一想,这是一种矫枉过正吗?
我一直在阅读Stroustrup的"The C++ Programming Language",他提到了很多"抽象":
许多最灵活,最有效和最有用的抽象涉及类型(类)和算法(函数)与其他类型和算法的参数化
和
C++是一种用于开发和使用优雅高效抽象的语言.
这与C++中的抽象类有什么关系?或者使用多态,继承或模板?
有人可以举个例子吗?
我对"Spaghetti Code"的理解是一个代码库,它从一个代码块跳转到另一个代码块,没有逻辑和清晰的目的.最常见的罪犯似乎是GOTO声明.
我目前正在阅读/参考清洁代码:敏捷软件工艺手册的功能章节.虽然自己承认,作者对功能的大小非常严格.我理解保持功能小的想法,然而,他建议它们应该在5行左右.虽然Classes肯定变得更易读,但我害怕通过编写较小的函数来创建意大利面条代码.较小的函数似乎也无意中创建了更高的抽象.
代码在什么时候成为意大利面条代码?如何抽象是过于抽象?任何答案都会非常有帮助.
顺便说一句,我是Stack Overflow的长期追随者,虽然这是我第一次发帖提问,所以对我的帖子的任何建议也是受欢迎的.
非常感谢!
我正在尝试创建一个具有较低级别库的解决方案,该库将知道在调用某些命令时需要保存和加载数据,但是在特定于平台的项目中将提供保存和加载函数的实现它引用了较低级别的库.
我有一些模型,例如:
type User = { UserID: UserID
Situations: SituationID list }
type Situation = { SituationID: SituationID }
Run Code Online (Sandbox Code Playgroud)
而我想要做的是能够定义和调用以下函数:
do saveUser ()
let user = loadUser (UserID 57)
Run Code Online (Sandbox Code Playgroud)
有没有办法在功能习语中干净地定义它,最好是在避免可变状态时(无论如何都不需要)?
一种方法可能看起来像这样:
type IStorage = {
saveUser: User->unit;
loadUser: UserID->User }
module Storage =
// initialize save/load functions to "not yet implemented"
let mutable storage = {
saveUser = failwith "nyi";
loadUser = failwith "nyi" }
// ....elsewhere:
do Storage.storage = { a real implementation of IStorage }
do Storage.storage.saveUser () …Run Code Online (Sandbox Code Playgroud) 我正在学习OOP和Java,而Abstraction的定义是将实现细节隐藏起来的过程,只有功能才会提供给用户.
有人可以解释一下功能和实现细节之间的区别是什么?
是否有针对消费者的内置或强大的第三方抽象在Java 8+中返回了价值?
PS对于延迟执行,它也可能返回Future。
更新。 函数接口在语法上有完美的匹配,但是在语义方面存在一些考虑。在这种情况下使用Function显然会破坏不更改外部状态的合同。怎么处理呢?
abstraction ×10
java ×3
function ×2
oop ×2
arraylist ×1
c++ ×1
clojure ×1
coding-style ×1
f# ×1
javascript ×1
logging ×1
namespaces ×1
php ×1
refactoring ×1
reusability ×1
storage ×1
xamarin ×1