小编Ruf*_*fus的帖子

传递单个对象与传递多个参数

假设我有以下内容

Class A {
    Foo getFoo();
    Bar getBar();
    Baz getBaz();
}
Run Code Online (Sandbox Code Playgroud)

我需要定义一个函数doStuff使用Foo,Bar,Baz一个对象,并做一些事情

我正在努力实现哪种方法doStuff更好(假设它不适合放在doStuff类中A)

方法A.

void doStuff(Foo foo, Bar bar, Baz baz)
{ 
    //some operation
}
Run Code Online (Sandbox Code Playgroud)

要么

方法B.

void doStuff(A a)
{
    Foo foo = a.getFoo();
    Bar bar = a.getBar();
    Baz baz = a.getBaz();
    //some operation
}
Run Code Online (Sandbox Code Playgroud)

据我所知,(+专业, - 缺点)

方法A.

+很清楚究竟有哪些参数可以doStuff()运行

- 易受长参数列表的影响,更容易受到用户错误的影响

方法B.

+简单易用的方法

+似乎更具可扩展性(?)

- 对课堂不必要的依赖 A


任何人都可以分享对这两种方法的利弊的额外见解吗?

parameters design-patterns method-call parameter-object

22
推荐指数
2
解决办法
9573
查看次数

什么是顺序组成?

这段视频(6:08)中,发言者提到了这句话

有一种称为顺序组合的编程风格,这意味着程序员可以处理非常狭窄的功能,并将各个部分组合在一起以实现各种功能

一个快速的谷歌搜索给了我维基百科这个问题,但对我天真的眼睛,他们看起来像正常的顺序编程

有人会详细解释他所指的这个顺序组合究竟是什么?它如何实现他提到的行为?

language-agnostic

13
推荐指数
1
解决办法
1562
查看次数

为什么Google Style Guide不鼓励前言声明?

并不是说谷歌风格指南是神圣的圣经,但作为一个新手程序员,它似乎是一个很好的参考.

Google样式指南列出了前向声明的以下缺点

  1. 前向声明可以隐藏依赖项,允许用户代码在标题更改时跳过必要的重新编译.

  2. 随后对库的更改可能会破坏前向声明.函数和模板的前向声明可以防止标题所有者对其API进行其他兼容的更改,例如扩展参数类型,添加具有默认值的模板参数或迁移到新的命名空间.

  3. 从名称空间std ::转发声明符号会产生未定义的行为.

  4. 可能很难确定是否需要前向声明或完整#include.用前向声明替换#include可以默默地改变代码的含义:

码:

  // b.h:
  struct B {};
  struct D : B {};

  // good_user.cc:
  #include "b.h"
  void f(B*);
  void f(void*);
  void test(D* x) { f(x); }  // calls f(B*)
Run Code Online (Sandbox Code Playgroud)

如果#include被B和D的forward decls替换,test()将调用f(void*).

  1. 从标题中声明多个符号的前向可能比简单地#include the header更加冗长.

  2. 构造代码以启用前向声明(例如,使用指针成员而不是对象成员)可以使代码更慢,更复杂.

然而,对SO的一些搜索似乎表明,前向声明通常是更好的解决方案.

因此,鉴于这些看似非平凡的缺点,有人可以解释这种差异吗?

什么时候忽略部分或全部这些缺点是安全的?

c++ forward-declaration google-style-guide

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

如何查看默认的buildkit版本?

背景

我想检查我当前使用 BuildKit 进行的 docker 设置是否包含此提交

问题

当我使用以下命令构建映像时,如何找出 docker 使用的 BuildKit 版本

DOCKER_BUILDKIT=1 docker build
Run Code Online (Sandbox Code Playgroud)

docker docker-buildkit

9
推荐指数
2
解决办法
5301
查看次数

并行执行过滤器和列表操作的最简单方法

我的程序使用了很多filterall并且列出了理解,我相信它们是并行化的最佳选择(通过多线程或GPU编程)。

那么并行化这些功能的最简单方法是什么?我正在寻找一种相当容易实现的方法(即,不必是最有效的方法或不需要达到最高水平的并行性),以便在潜入更复杂的方法(如PyCUDA等)之前获得潜在的加速效果。

python parallel-processing concurrency gpu

7
推荐指数
0
解决办法
774
查看次数

如何在lambda中指定参数类型?

对于常用功能,您可以按如下方式注释类型

def my_function(arg1: int)
Run Code Online (Sandbox Code Playgroud)

我怎么在lambda中这样做?

lambda a: int, b: int : a+b
Run Code Online (Sandbox Code Playgroud)

给出语法错误.

python lambda

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

何时使用 drake-visualizer 与 meshcat 可视化工具

drake 提供的这 2 个可视化工具有什么区别?我什么时候应该使用其中一种而不是另一种?

drake

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

标头中的私有静态const成员变量与cpp中的const变量

为什么我应该static const在标头中声明一个私有变量(并在cpp中对其进行初始化),而不是仅仅在cpp中定义+声明它?


案例1.h

class MyClass
{
    ...
    private:
        static const MyType some_constant;
}
Run Code Online (Sandbox Code Playgroud)

case1.cpp

const MyType MyClass::some_constant = ...;
Run Code Online (Sandbox Code Playgroud)

case2.h

//No mention of some_constant at all
Run Code Online (Sandbox Code Playgroud)

case2.cpp

const MyType some_constant = ...;
Run Code Online (Sandbox Code Playgroud)

假设遵循通用的c ++约定(1标头和cpp仅与1类相关联,从不与#include.cpp文件相关联),在两种情况下,变量均为该类专用,均在调用构造函数之前进行了初始化,均提供了是“静态类局部常量”。

两种方法之间有什么区别吗?(哪一个更可取)?

c++ static const

5
推荐指数
1
解决办法
2492
查看次数

ThreadPoolExecutor 如何利用 32 个 CPU 核心来执行 CPU 密集型任务

来自ThreadPoolExecutor

在 version 3.8 中更改: max_workers 的默认值更改为 min(32, os.cpu_count() + 4)。此默认值为 I/O 绑定任务保留至少 5 个工作线程。它最多使用 32 个 CPU 核心来执行释放 GIL 的 CPU 密集型任务。它避免了在多核机器上隐式使用大量资源。

根据我对 GIL 的理解,基于线程的并发仅适用于 I/O 绑定任务。对于 CPU 密集型任务,基于线程的并发是不可能的,这意味着对于 CPU 密集型任务,GIL 仅强制单线程执行。我的理解似乎与 中的粗体行相矛盾ThreadPoolExecutor。我在这里误解了什么?

此外,什么是

释放GIL

意思是?CPU 密集型任务不会保留 GIL(除非它被抢占)吗?

这个答案来看,我怀疑这与

大部分时间都花在旨在发布 GIL 的外部库上(如 NumPy)

这是否意味着只要线程在某些专门设计的“旨在释放 GIL”的外部库中执行 CPU 密集型任务,CPU 密集型任务的基于线程的并发实际上是可能的?

python multithreading gil python-3.x

5
推荐指数
1
解决办法
1422
查看次数

杀死 shell=True 进程导致 ResourceWarning: subprocess is still running

遵循如何终止使用 shell=True 启动的 python 子进程的建议

我有一个过程,我从以下开始

process = subprocess.Popen(my_cmd, shell=True, executable='/bin/bash', preexec_fn=os.setsid)
Run Code Online (Sandbox Code Playgroud)

my_cmd 的形式为 some_cmd_that_periodically_outputs_to_stdout | grep "some_fancy_regex" > some_output_file.txt

我用以下命令终止进程

os.killpg(os.getpgid(process.pid), signal.SIGKILL)
Run Code Online (Sandbox Code Playgroud)

杀死后,我收到以下警告

ResourceWarning: subprocess XXX is still running
Run Code Online (Sandbox Code Playgroud)

为什么我会收到此警告?

python subprocess

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