通常,当我们将新功能引入应用程序时,我们可能会生成工件,例如可以在我们的应用程序的其他区域中重用的有用方法或类.这些工件不一定记录为功能要求,因为它们通常是我们实现选择的副作用.由于我们经常在团队中开发,因此分享这些代码以防止返工和重复非常重要.
例子:
您发现什么是共享这些工件的最有效方式?
您如何表达您在创建时所做的假设?
你如何确保他们被正确消费?
我对文档,代码图,会议(?)方面的最佳实践和经过验证的技术感兴趣,以确保正确地重用代码.
这个问题非常类似于:寻找可重复使用的代码,但我对更积极主动而不是被动的方法感兴趣.
好的,所以我现在有两个(完全不相关的,不同的项目)类使用迭代器.一个拥有iterator并按reverse_iterator预期工作,另一个,当前一个具有iterator半破坏const_iterator(具体而言,因为const_iterator派生自迭代器,代码LinkedList<int>::iterator i = const_list.begin()有效并允许您修改const定义的列表......).
我打算将所有四种类型添加到这个类......如果可以的话.
我如何继续最小化复制/粘贴代码并仅更改返回类型?创建一个类似于base_iterator继承的基类?创建一个iterator或const_iterator从中继承?从某些std :: class继承?如果这些案例中的任何一种都是"最佳"方法,那么代码会在哪里?
也许没有其他选择是好的?我在这里迷路了,找不到太多的参考资料.
任何建议都表示赞赏,但请记住,我是这个主题的新手(一般都是迭代器和C++,尤其是OOP).我试图研究GCC附带的头文件是徒劳的 - 它们并不完全是我正在寻找的教程.
我们在工作中有相当多的可重用代码(一件好事).每当我创建一个使用它们的新项目时,我习惯将他们的项目作为我的解决方案的一部分包含在内,我想知道是否应该将它们重新用作已发布的dll.我包含该项目的原因(或理由)是,如果我发现其中一个错误,我可以在那里进行分支和修复.但它似乎将我的重点放在手头的项目上.
(不确定这是否应该是CW,因为只有两个答案,我有兴趣了解您的偏好)
我正在为我的应用程序处理异常处理层.
我读过很多关于接口和泛型的文章.我之前已经使用了很多遗产,我对那个领域很满意.
我有一个非常简短的设计,我将要实现:
public interface IMyExceptionLogger
{
public void LogException();
// Helper methods for writing into files,db, xml
}
Run Code Online (Sandbox Code Playgroud)
我有点困惑我接下来应该做什么.
public class FooClass: IMyExceptionLogger
{
// Fields
// Constructors
}
Run Code Online (Sandbox Code Playgroud)
我应该LogException()在其中实施方法FooClass吗?如果是的话,我正在努力想看看我如何更好地使用界面而不是具体的类......
我有各种各样的类可以使用该接口,但我不想在每个类中编写该接口的实现.
同时如果我在一个类中实现一个接口,然后在应用程序的不同层中使用该类,我将仍然使用具体的类而不是接口,这是一个糟糕的OO设计......
我希望这是有道理的.
欢迎任何反馈和建议.
请注意,我对使用net4log或其竞争对手不感兴趣,因为我这样做是为了学习.
谢谢
编辑:
写了一些代码.因此,我将实现各种与此接口,即记录仪的DBExceptionLogger,CSVExceptionLogger,XMLExceptionLogger等比我仍然会结束与具体的类,我将在我的应用程序的不同层使用.
我倾向于编写如下代码:
BufferedWriter w = null; // Or any other object that throws exceptions and needs to be closed
try {
w = new BufferedWriter(new FileWriter(file));
// Do something with w
} catch (IOException e) {
e.printStackTrace();
} finally {
if (w != null) {
try {
w.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
它通常涉及一个抛出异常并需要关闭的对象,关闭它也可能会抛出异常.
我想知道上述代码是否可以以任何方式简化或重用.
有人熟悉Yabble或其他浏览器端的CommonJS加载器吗?
我正在尝试使用Node.js,并且非常希望创建可以在服务器端和客户端互换使用的Javascript模块.这可能最终变得更像是"因为它太棒了"而不是"因为它是实用且有用"的东西.
因此,我基本上试图让CommonJS require()方法在浏览器端工作,这正是Yabble应该做的.我不知道从哪里开始.除了在Yabble的Github自述文件中找到的内容之外,我似乎无法找到任何文档,而且这并没有多大帮助.
基本上我所做的就是将它放在HTML页面中......
<script src="yabble.js"></script>
<!-- Uses require -->
<script>
require.setModuleRoot('http://localhost:8030/')
my_module = require('my_module')
</script>
Run Code Online (Sandbox Code Playgroud)
但是无论何时我调用该require()函数,我都会Synchronous require() is not supported.抛出异常.
有人可以帮助我开始吗?我应该在哪里加载yabble.js我应该要求的地方?有没有一种特殊的方式来运行我的Javascript模块?
我想编写一个可重用的函数,我可以在任何方法中调用它来记录所有局部变量的快照.例如:
void somemethod()
{
int a = 1;
string s = "something";
dumpLocalVariables("step 1", MethodInfo.GetCurrentMethod(), this);
a++;
string t = s + "else";
dumpLocalVariables("step 2", MethodInfo.GetCurrentMethod(), this);
}
Run Code Online (Sandbox Code Playgroud)
我想获得这样的控制台输出:
step 1
Int32 a = 1
String s = something
step 2
Int32 a = 2
String s = something
String t = somethingelse
Run Code Online (Sandbox Code Playgroud)
我想避免提供一个特定的局部变量名列表.
我能找到的最接近的是MethodInfo.GetCurrentMethod().GetMethodBody().LocalVariables,但我不知道如何使用反射访问局部变量的值.
void dumpLocalVariables(string context, MethodBase currentMethod, object obj)
{
Console.WriteLine(context);
MethodBody methodBody = currentMethod.GetMethodBody();
foreach (LocalVariableInfo lvi in methodBody.LocalVariables)
{
string variableType = lvi.LocalType.Name; …Run Code Online (Sandbox Code Playgroud) 我是ios开发的新手,而我刚刚开始研究我的第一个应用程序.现在我的应用程序几乎在每个页面上都有一个主页按钮,在该按钮后面调用相同的代码片段以移动到主屏幕.这是每个具有主页按钮的控制器中的大量重复代码.这只是一个例子.还有很多其他场景,程序员仍在学习编码,我认为这是不好的做法,因为任何改变都必须在每个控制器上单独进行.
所以我的问题是,在为ios编码时,这种场景中的最佳实践是什么?
通过观察各种Android应用程序的源代码(不是我编写的),我注意到了将某些代码片段放入自己的方法中的模式,尽管实际上没有任何代码重用,因为这些方法只在整个过程中被调用一次应用.
到目前为止,我有一个经验法则,规定如果在应用程序代码中使用两次或更多代码,那么它就有其自身的方法,仅仅是为了消除代码冗余.
但是看到那些整齐地将代码块分解成自己的方法(以及自己的方法调用开销),我开始说,也许我错过了一些东西.
除了用于文档目的之外,还有什么其他原因可以证明只将4行代码(只调用一次!)放入自己的方法中?
也许是一个愚蠢的问题,但我需要一些确认.
通常,当我处理可以在我的应用程序中多次使用的对象时,我使用如下方法.
例如NSDecimalNumber+Extension,创建一个扩展,或者创建一个数字格式化程序的类实用程序,如下所示.
+ (NSNumberFormatter*)internal_sharedNumberFormatter
{
static NSNumberFormatter* _internal_numberFormatter = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_internal_numberFormatter = [[NSNumberFormatter alloc] init];
// other configurations here...
});
return _internal_numberFormatter;
}
+ (NSString*)stringRepresentationOfDecimalNumber:(NSDecimalNumber*)numberToFormat
{
NSString *stringRepresentation = [[self class] internal_sharedNumberFormatter] stringFromNumber:numberToFormat];
return stringRepresentation;
}
Run Code Online (Sandbox Code Playgroud)
这种方法非常好,因为例如格式化程序的创建成本很高.但它也可以应用于其他情况.
现在,我的问题如下.
在涉及不同执行路径(不同线程)的情况下,此方法是否也有效?
所以,如果我先stringRepresentationOfDecimalNumber在主线程上调用然后在另一个线程中调用,会发生什么?
我认为stringRepresentationOfDecimalNumber在不同的线程中执行不同的调用是有效的,因为共享格式化程序,在这种情况下,只是只读,但我想得到专家的回复.
提前致谢.
code-reuse ×10
c# ×2
java ×2
refactoring ×2
.net ×1
c++ ×1
coding-style ×1
commonjs ×1
concurrency ×1
debugging ×1
dry ×1
exception ×1
generics ×1
inheritance ×1
interface ×1
ios ×1
iphone ×1
iterator ×1
javascript ×1
node.js ×1
nsformatter ×1
objective-c ×1
reflection ×1