标签: library-design

scala.Predef中$ scope的目的是什么?

scala.Predef 包含以下代码:

// Apparently needed for the xml library
val $scope = scala.xml.TopScope
Run Code Online (Sandbox Code Playgroud)

有人想出为什么它是必要的,考虑到它创建了可能很容易从标准库中分离出来的包的依赖关系?

xml scope scala library-design

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

Scala:包对象与包内的单例对象

我想将一组类似的函数分组到 scala 的库中。这是我在其他地方看到的两种方法。我想了解两者之间的差异。

包中定义的单例对象

// src/main/scala/com/example/toplevel/functions.scala
package com.example.toplevel

object functions {
  def foo: Unit = { ... }
  def bar: Unit = { ... }
}
Run Code Online (Sandbox Code Playgroud)

封装对象

// src/main/scala/com/example/toplevel/package.scala
package com.example.toplevel

package object functions {
  def foo: Unit = { ... }
  def bar: Unit = { ... }
}
Run Code Online (Sandbox Code Playgroud)

比较

据我所知,第一种方法需要functions在您想要使用其功能时显式导入该对象。而包对象方法允许包中的任何内容functions访问这些方法而无需导入它们。

即,com.example.toplevel.functions.MyClass可以隐式访问com.example.toplevel.functions.foo

我的理解正确吗?

如果 中没有定义类com.example.toplevel.functions,则这些方法似乎是等效的,这是正确的吗?

scala library-design

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

可以从C ++编写C头文件

我正在研究应该从C和C ++使用的某些库头文件。由于C没有命名空间概念,因此我将在头文件中定义的所有名称中添加“库前缀”。相比之下,对于C ++,我将定义一个名称空间。所以我目前认为设计是这样的:

mylib.h

#ifdef __cplusplus
namespace mylib{
#define NAME_PREFIX(identifier) identifier
extern "C" {
#else
#define NAME_PREFIX(identifier) mylib_identifier
#endif

int NAME_PREFIX(foo)(void);

//other declarations go here

#ifdef __cplusplus
} //extern "C"
} //namespace mylib
#endif
Run Code Online (Sandbox Code Playgroud)

我从未见过这样的东西,所以我不确定这是否常见。不鼓励这样做吗?有哪些可能的缺点?

c c++ software-design library-design

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

我应该如何为我的python应用程序构建一个简单的数据库包?

我正在使用sqlite3作为基础为我的应用程序构建数据库库.我想像这样构造它:

db/
    __init__.py
    users.py
    blah.py
    etc.py    

所以我会用Python做到这一点:

import db
db.users.create('username', 'password')
Run Code Online (Sandbox Code Playgroud)

我正在分析如何处理数据库连接的分析瘫痪(哦不!).我真的不想在这些模块中使用类,能够创建一堆可以以相同方式操作同一数据库的"用户"对象似乎并不合适 - 因此继承连接是不走.

我是否应该与所有模块使用的数据库建立一个全局连接,然后将其放在每个模块中:

#users.py
from db_stuff import connection
Run Code Online (Sandbox Code Playgroud)

或者我应该为每个模块创建一个新连接并保持活着吗?

或者我应该为每个交易创建一个新连接?

这些数据库连接应该如何使用?对于游标对象也是如此:我是否为每个事务创建一个新游标?为每个数据库连接只创建一个?

python database sqlite library-design

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

`gsl::string_span` 的目的是什么?

在阅读Microsoft's implementation of Cpp Core Guidelines 时,我遇到了两个问题:

  1. 为什么gsl::string_spangsl::span已经运行良好的地方提供?
  2. 为什么gsl::zstring_spanstd::string自 C++11 以来已保证以空值终止的地方提供?

任何说明情况都将受到高度赞赏。

c++ library-design c++11 cpp-core-guidelines

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

如果字符串有空格,则引发编译时错误

我有一个基类,打算由我正在编写的代码的其他用户继承,其中一个抽象函数返回对象的名称。由于项目的性质,名称不能包含空格。

class MyBaseClass {

  public:

    // Return a name for this object. This should not include whitespace.
    virtual const char* Name() = 0;

};
Run Code Online (Sandbox Code Playgroud)

有没有办法在编译时检查Name()函数的结果是否包含空格?我知道constexpr函数可以进行编译时操作,但我不确定以正确的方式向代码用户发出信号,告知他们的函数返回一个顽皮的字符串。

我也不清楚如何让constexpr编译器实际执行一个函数来执行这样的检查(如果constexpr是这样的话)。

c++ library-design compile-time constexpr

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

为什么std :: this_thread命名空间?

std :: this_thread命名空间有技术原因吗?为什么这个命名空间的成员不能被实现为std :: thread类的静态成员?

c++ library-design c++11

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

为什么C++ 03文件流不接受字符串构造函数参数?

为什么以下代码编译C++11而不在C++03(两个gcccl)

#include <string>
#include <iostream>
#include <fstream>

int main(int argc, char* argv[]) {
    const std::string t("Hello");
    std::ofstream out(t);
}
Run Code Online (Sandbox Code Playgroud)

为什么C++03流不接受std::string构造函数参数?这个决定是基于某些事情还是偶然发生的?

c++ fstream library-design c++11 c++03

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

如何在C中设计静态库的接口

虽然我不是C语言的经验丰富的程序员,但我必须在工作中使用这种语言来构建一个静态库,它可以在SunOS和Win32上编译.这个库只有几个源文件及其相应的头文件(让我们说:a.c,b.c,a.hb.h).项目在两个平台中编译,并mylib.a生成库.

我的问题是如何将实现的函数暴露mylib.a给其他项目,因为当我添加两者时a.h,b.h我得到一些宏重定义错误.

编辑:我发现宏重新定义错误是因为编译命令中的宏定义(与我的标题无关)并且它已经解决了:)但我仍然希望组织我的源文件和头文件.

我怀疑的是我是否修改a.hb.h在外部使用,或者我是否应该专门创建一个头文件来声明这个库的接口(让我们说mylib.h).我不想过度复杂化原始标题,但我不想让同一个标题保持同步...我想听听更有经验的C程序员关于他们的模式,每种方法的优点以及是否还有其他方法选项.

先感谢您.

编辑:似乎我没有提供足够的信息; 下面的模式试图显示我的文件是如何组织的:每个代码文件只包含其标题,每个标题都有一个保护条件,每个标题包含一个公共标题,这个公共标题包括所有标题.

// a.c ----
#include "a.h"

// b.c ----
#include "b.h"

// a.h ----
#ifndef GUARD_A_H
#define GUARD_A_H
  # include "liball.h"
  void function_prototypes_implemented_in_a();
#endif // GUARD_A_H

// b.h ----
#ifndef GUARD_B_H
#define GUARD_B_H
  # include "liball.h"
  void function_prototypes_implemented_in_b();
#endif // GUARD_B_H

// liball.h ----
#ifndef GUARD_LIBALL_H
#define GUARD_LIBALL_H
  # include <time.h>   // …
Run Code Online (Sandbox Code Playgroud)

c static-libraries library-design static-linking

2
推荐指数
1
解决办法
1943
查看次数

为什么不是扩展 Functor Contravariant 的 Phantom 类?

我在玩弄Data.Functor.Contravariant. 该phantom方法引起了我的注意:

phantom :: (Functor f, Contravariant f) => f a -> f b
phantom x = () <$ x $< ()
Run Code Online (Sandbox Code Playgroud)

或者,更具体地说,对它的注释:

如果f两者都是FunctorContravariant那么当您考虑每个类别的法律时,它实际上无法以任何有意义的能力使用它的论点。这种方法非常有用。当这两种情况存在,是合法的,我们有以下规律:fmap f ? phantomcontramap f ? phantom

既然fmap f ? contramap f ? phantom,为什么我们需要ContravariantFunctor实例?用另一种方式做这件事不是更方便:为一个类创建一个实例Phantom,它引入了phantom方法,然后自动Functor派生实例Contravariant?

class Phantom f where
    phantom :: f a -> f b …
Run Code Online (Sandbox Code Playgroud)

haskell covariance contravariance functor library-design

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

你会在这做什么?返回null或抛出异常(框架设计指南)

我正在开发一个C#.NET Framework 4.0库.

我有这个代码:

public static byte GetBatchStatus(string connString)
{
    if (string.IsNullOrEmpty(connString))
        throw new ArgumentNullException("connString");

    byte status;

    using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(connString))
    {
        conn.Open();

        SqlCommand cmd = new SqlCommand();

        cmd.CommandText = GetBatchStatusValueSQL;
        cmd.CommandType = CommandType.Text;
        cmd.Connection = conn;

        object o = cmd.ExecuteScalar();
        // Throws an ArgumentNullException if o is null.
        if (o == null)
            throw new ArgumentNullException("o");

        status = Convert.ToByte(o);
    }

    return status;
}
Run Code Online (Sandbox Code Playgroud)

cmd.ExecuteScalar();可以返回null,但Convert.ToByte(o);返回0.

如果cmd.ExecuteScalar();返回null则为错误,因为我正在寻找的值必须在数据库上.如果该值不在数据库上则是错误.

你会在这做什么?返回null或抛出异常?

.net c# library-design

0
推荐指数
1
解决办法
146
查看次数

如何进行嵌套导入

我正在尝试清理我的用户 api,以便用户可以整齐地从单个包对象导入,并获取所有内容。我意识到我可以将我的包裹移动到顶部包裹中,但我想知道是否有办法执行以下操作(我知道这可能不是最佳实践):

我有以下软件包:

package org.Me.packages.packageA

case class A() {
// some implementation
}

package org.Me.packages.packageB

case class B() {
// some implementation
}
Run Code Online (Sandbox Code Playgroud)

现在这将需要导入表单:

import org.Me.packages.packageA.A
import org.Me.packages.packageB.B
Run Code Online (Sandbox Code Playgroud)

我被要求做的是以下内容:

package org.Me.combinedPackages

package object Combined {
   import org.Me.packages.packageA.A
   import org.Me.packages.packageB.B 
}
Run Code Online (Sandbox Code Playgroud)

这样我的最终用户就可以简单地执行以下操作:

import org.Me.combinedPackages._

// access both a and b here
Run Code Online (Sandbox Code Playgroud)

从我在这里读到的,我理解这意味着嵌套导入是不可能的。

那么我想要做的事情是不可能的吗?我意识到存在其他方式。

import scala object package library-design

0
推荐指数
1
解决办法
80
查看次数