标签: strong-typing

使用强类型语言还有多远?

假设我正在编写一个API,我的一个函数采用一个代表一个通道的参数,并且只会在值0和15之间.我可以这样写:

void Func(unsigned char channel)
{
    if(channel < 0 || channel > 15)
    { // throw some exception }
    // do something
}
Run Code Online (Sandbox Code Playgroud)

或者我是否利用C++作为强类型语言,并使自己成为一种类型:

class CChannel
{
public:
    CChannel(unsigned char value) : m_Value(value)
    {
        if(channel < 0 || channel > 15)
        { // throw some exception }
    }
    operator unsigned char() { return m_Value; }
private:
    unsigned char m_Value;
}
Run Code Online (Sandbox Code Playgroud)

我的功能现在变为:

void Func(const CChannel &channel)
{
    // No input checking required
    // do something
}
Run Code Online (Sandbox Code Playgroud)

但这总是矫枉过正吗?我喜欢自我记录,并保证它是它所说的,但它是否值得支付这样一个对象的构造和破坏,更不用说所有额外的打字?请让我知道您的意见和备选方案.

c++ api types strong-typing

42
推荐指数
6
解决办法
2357
查看次数

什么是Java的原始类型?

什么是Java中的原始类型?

原始类型和引用类型之间有什么区别?

Java有多少原始类型,它们是什么?

java types strong-typing primitive-types

41
推荐指数
3
解决办法
8万
查看次数

37
推荐指数
4
解决办法
4万
查看次数

在C中强制执行强类型检查(typedefs的类型严格性)

有没有办法对相同类型的typedef强制执行显式转换?我要处理utf8,有时我会对字符数和字节数的索引感到困惑.所以有一些typedef很好:

typedef unsigned int char_idx_t;
typedef unsigned int byte_idx_t;
Run Code Online (Sandbox Code Playgroud)

除此之外,您需要在它们之间进行显式转换:

char_idx_t a = 0;
byte_idx_t b;

b = a; // compile warning
b = (byte_idx_t) a; // ok
Run Code Online (Sandbox Code Playgroud)

我知道C中不存在这样的功能,但也许你知道一个技巧或编译器扩展(更好的gcc).


编辑 我仍然不喜欢一般的匈牙利符号.由于项目编码惯例,我无法将它用于此问题,但我现在在另一个类似的情况下使用它,其中类型相同且含义非常相似.我不得不承认:它有所帮助.我永远不会用起始"i"来声明每个整数,但是就像Joel的重叠类型的例子一样,它可以挽救生命.

c typedef typechecking strong-typing

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

PHP7中的标量和严格类型是性能增强功能吗?

从PHP7开始,我们现在可以使用标量typehint并在每个文件的基础上请求严格类型.使用这些功能是否有任何性能优势?如果有,怎么样?

在互联网周围,我只发现了概念上的好处,例如:

  • 更精确的错误
  • 避免不必要的类型强制问题
  • 更多的语义代码,避免在使用其他代码时产生误解
  • 更好的IDE评估代码

php performance types strong-typing php-7

34
推荐指数
2
解决办法
6876
查看次数

Angular 14 严格类型反应式表单 - 如何使用现有接口键入 FormGroup 模型

我只是在玩新的角度类型表单 api,不知道如何输入FormGroup在不声明特定“FormInterface”女巫必须与原始界面相匹配的情况下进行键入。

也许我错过了一些东西,或者根本不可能这样做。

我能够使事情正常工作(下面的示例),但我不喜欢这里的UserForm接口声明,它没有对User接口的引用,并且必须是它的镜像副本,但带有FormControl<>字段。

在这种情况下是否可以FormGroup仅使用User界面进行输入?

stackblitz上提供完整的工作示例

用户模型.ts

export interface User {
  firstName: string;
  lastName: string;
  email: string;
  age: number | null;
}
Run Code Online (Sandbox Code Playgroud)

用户服务.ts

@Injectable()
export class UserService {

  add(user: User): void {
    console.log('Add user', user);
  }

}
Run Code Online (Sandbox Code Playgroud)

应用程序组件.ts

interface UserForm {
  firstName: FormControl<string>;
  lastName: FormControl<string>;
  email: FormControl<string>;
  age: FormControl<number | null>;
}

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
})
export class AppComponent implements OnInit {
  form: FormGroup<UserForm>;

  constructor(private …
Run Code Online (Sandbox Code Playgroud)

strong-typing angular angular14

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

在Cocoa/Objective-C中是否有类似通用列表的东西?

我在C#中真正喜欢的是通用列表.一个只能包含一种对象的列表.在Cocoa/Objective-C中有类似通用列表的东西吗?到目前为止,我只知道NSArray谁将指向任何对象.

cocoa list objective-c strong-typing data-structures

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

在Typescript中使用接口或类时

我有一个简单的登录方案,要求用户在Typescript中输入电子邮件和密码.我需要创建一些类型来获得强类型并将其发送到后端.

应该写成:

export interface UserLogin {
  email: string;
  password: string;
}
//OR
export class UserLogin {
  email: string;
  password: string;
}
Run Code Online (Sandbox Code Playgroud)

以及如何知道何时使用这些方案?

interface class strong-typing web typescript

30
推荐指数
4
解决办法
2万
查看次数

使用组合 API 和打字稿打字系统对 vue 组件进行强打字

我正在使用带有打字稿的 vue 组合 api。

如何使用打字稿打字系统对组件道具进行强类型输入?

strong-typing typescript vue.js vue-composition-api

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

带有强类型枚举的模板参数推导

如果我有一个普通(弱)枚举,我可以使用它的枚举值作为非类型模板参数,如下所示:

enum { Cat, Dog, Horse };

template <int Val, typename T> bool magic(T &t)
{
    return magical_traits<Val>::invoke(t);
}
Run Code Online (Sandbox Code Playgroud)

并称之为: magic<Cat>(t)

据我所知,如果我有一个强类型的枚举,并且不想硬编码枚举类型,我最终得到:

enum class Animal { Cat, Dog, Horse };

template <typename EnumClass, EnumClass EnumVal, typename T> bool magic(T &t)
{
    return magical_traits<EnumVal>::invoke(t);
}
Run Code Online (Sandbox Code Playgroud)

现在我得写:magic<Animal, Animal::Cat>(t)这似乎是多余的.

有没有办法避免输入枚举类和值,缺少

#define MAGIC(E, T) (magic<decltype(E), E>(T));
Run Code Online (Sandbox Code Playgroud)

c++ templates strong-typing template-argument-deduction c++17

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