小编fiz*_*zer的帖子

C或C++中良好的getos的例子

在这个主题中,我们看一下gotoC或C++ 的良好用法示例.它的灵感来自人们投票的答案,因为他们认为我在开玩笑.

摘要(标签从原始标签更改为使意图更清晰):

infinite_loop:

    // code goes here

goto infinite_loop;
Run Code Online (Sandbox Code Playgroud)

为什么它比替代品更好:

  • 这是具体的. goto是导致无条件分支的语言构造.替代方案取决于使用支持条件分支的结构,具有退化的始终为真的条件.
  • 标签记录了意图,没有额外的评论.
  • 读者不必扫描早期介入代码breakS(尽管它仍然可能无原则黑客模拟 continue与早期goto).

规则:

  • 假装gotophobes没有赢.据了解,上述内容不能用于实际代码中,因为它违背了既定惯用语.
  • 假设我们都听说'Goto被认为有害',并且知道goto可以用来写意大利面条代码.
  • 如果你不同意一个例子,那就单独批评技术优点('因为人们不喜欢goto'不是技术原因).

让我们看看我们是否可以像成年人一样谈论这个问题.

编辑

这个问题现在好了.它产生了一些高质量的答案.感谢大家,尤其是那些认真对待我的小循环示例的人.大多数怀疑论者都担心缺乏范围.正如@quinmars在评论中指出的那样,你总是可以在循环体上放置大括号.我顺便注意到for(;;)并且while(true)也没有给你免费的大括号(并且省略它们会导致烦恼的错误).无论如何,我不会浪费任何更多的脑力这个小事-我可以用无害的习惯生活for(;;)while(true)(一样好,如果我想继续我的工作).

考虑到其他反应,我发现许多人认为goto你总是需要以另一种方式重写.当然,你可以goto通过引入一个循环,一个额外的标志,一堆嵌套的ifs或其他什么来避免,但为什么不考虑是否goto可能是这项工作的最佳工具?换句话说,人们准备忍受多少丑陋以避免使用内置语言功能达到预期目的?我的看法是,即使添加一面旗帜,也要付出太高的代价.我喜欢我的变量来表示问题或解决方案域中的事物.'唯一要避免goto'不削减它.

我会接受第一个给出C模式分支到清理块的答案.国际海事组织,这是goto所有已发布答案的最强情况,当然,如果你通过一个仇恨必须通过避免它的扭曲来衡量它.

c c++ goto

79
推荐指数
11
解决办法
15万
查看次数

管理单元测试的维护负担

首先编码测试,我发现我的代码中可能有3/4是单元测试; 如果我真的是极端的,除了修复失败的单元测试之外没有编写一行代码,这个比例会更高.维护所有这些单元测试会增加代码更改的大量惯性.在早期,我把它搞砸并修复它们.一旦有压力,我最终会找到一个broken_unit_tests目录,以便在有时间的情况下重新访问.在设计有时间结晶之前,感觉TDD过早地进行了高覆盖率.

我如何找到摆脱这种困境的方法,并开始欢迎像我应该的那样改变需求?

tdd agile unit-testing

27
推荐指数
3
解决办法
1200
查看次数

Code Golf:用最少的代码行打印整个"12 Days of Christmas"歌曲

打印流行节日歌曲的所有12节经文.

在12 节经文中,我的意思是在歌曲中演唱的每一行的重复,即

第一节:在圣诞节的第一天,我的真爱给了我一棵梨树上的鹧..

第二节在圣诞节的第二天,我的真爱给了我两只斑鸠和一棵梨树上的鹧..

...

N:在圣诞节的第n天,我的真爱给了我(没有第一行的第N-1节)(第N行增加了一行)

language-agnostic code-golf rosetta-stone

25
推荐指数
15
解决办法
9087
查看次数

为什么模板参数推导失败指针到成员函数?

用g ++ 5.4,这个

struct B {
    void f() {}
}; 

struct D : public B {
    void g() {}
};

template <class T>
void foo(void (T::*)(), void (T::*)())
{}

int main()
{
    foo(&D::f, &D::g);
}
Run Code Online (Sandbox Code Playgroud)

由于"推断出参数'T'('B'和'D')的冲突类型而失败".为什么不将T推导为D,完全匹配?

c++ templates argument-deduction

13
推荐指数
2
解决办法
935
查看次数

你在日志中写了什么?

在我工作过的每个地方,程序员都带着一张A4硬背书.为了避免吸引注意力,我尽职尽责地携带一个,每次会议一两次,我点头,并假装写下一些有趣的东西.人们偶尔会无人看管他们,我偷偷摸摸一看.大多数情况下,他们似乎正在按照发生的顺序写下他们所做的一切的完整叙述.有些人用"七"中的凯文·斯派西(Kevin Spacey)角色这样的小潦草书写书.

我似乎无法像其他人一样组织这些书.几乎我生成的所有纸张都扔掉了,所以我使用松散的纸张.需要保留的东西最终会出现在设计文档或维基中.TODO最好在我的显示器上跟踪Post-Its.浏览器书签负责处理有关第三方工具的大多数日常信息,等等.

任何拥有有效日志系统的人都可以分享吗?

language-agnostic time-management

12
推荐指数
3
解决办法
2万
查看次数

如何在多线程C++中拆除观察者关系?

我有一个主题,提供Subscribe(Observer*)Unsubscribe(Observer*)提供给客户.Subject在其自己的线程中运行(从中调用Notify()订阅的Observers),并且互斥锁保护其内部的Observers列表.

我希望客户端代码 - 我无法控制 - 能够在取消订阅后安全地删除Observer.怎么能实现这一目标?

  • 持有互斥锁 - 甚至是递归的互斥锁 - 当我通知观察者时,由于死锁风险而无法选择.
  • 我可以在Unsubscribe调用中标记要删除的观察者,并将其从主题线程中删除.然后,客户可以等待特殊的"安全删除"通知.这看起来很安全,但对客户来说很麻烦.

编辑

一些说明性代码如下.问题是如何防止在"运行时出现问题"注释时发生取消订阅.然后我可以回拨一个已删除的对象.或者,如果我持有互斥锁而不是制作副本,我可以使某些客户端死锁.

#include <set>
#include <functional>
#include <boost/thread.hpp>
#include <boost/bind.hpp>

using namespace std;
using namespace boost;

class Observer
{
public:
    void Notify() {}
};

class Subject
{
public:
    Subject() : t(bind(&Subject::Run, this))
    {
    }

    void Subscribe(Observer* o)
    {
        mutex::scoped_lock l(m);
        observers.insert(o);
    }

    void Unsubscribe(Observer* o)
    {
        mutex::scoped_lock l(m);
        observers.erase(o);
    }

    void Run()
    {
        for (;;)
        {
            WaitForSomethingInterestingToHappen();
            set<Observer*> notifyList;
            {
                mutex::scoped_lock l(m); …
Run Code Online (Sandbox Code Playgroud)

c++ oop multithreading design-patterns

11
推荐指数
2
解决办法
1920
查看次数

惯用语(defn -main ...)在clojure程序中意味着什么?

我熟悉Java和Lisp的软件包,但是我在其他人的代码中看到的是一些明显的习惯用法,例如调用入口点'-main'并在命名空间名称中使用反引号(in-ns`foo ),那种事.我没有在文档或教程中的任何地方看到这些拼写.是否有一些资源可以解释围绕结构化程序的这些约定?

编辑:

我想我必须从这个答案中找到反击的东西:在多个文件上拆分Clojure名称空间,我在试图理解(defn -main ...)时偶然发现这个问题.鉴于作者,我把它作为最佳实践.然而,现在我引用他引用的Clojure来源,我发现只使用常规引用.我猜这很可能是一个错字.

(相应地缩小了题目标题的范围)

clojure

11
推荐指数
1
解决办法
1973
查看次数

可以/应该通过赋值给属性来实现Python方法吗?

通过赋值给类属性来实现琐碎的方法有任何风格禁忌或其他缺点吗?例如喜欢bar和喜欢baz,而不是更多的因果foo.

class MyClass(object):
    def hello(self):
        return 'hello'
    def foo(self):
        return self.hello()
    bar = lambda self: self.hello()
    baz = hello
Run Code Online (Sandbox Code Playgroud)

我发现自己被这样的事物的表面经济所诱惑:

__str__ = __repr__ = hello
Run Code Online (Sandbox Code Playgroud)

python coding-style

6
推荐指数
1
解决办法
107
查看次数

为什么clojure-mode用一些卷曲的f字符替换fn?

我刚刚开始使用emacs入门套件和clojure模式.现在,当我(fn在clojure模式下键入或粘贴' '缓冲区时,' fn'字符在窗口中被替换为略微卷曲的小写f.缓冲区被正确保存,但它非常烦人,特别是当我发现这个功能时很困难 - 对某人的'不可能'代码片段感到困惑,然后在光线昏暗之前将其编辑成单行.知道为什么会这样做,或者更重要的是,如何关闭它?

emacs clojure

4
推荐指数
1
解决办法
1964
查看次数