不区分大小写命名约定

时间:2017-11-06 18:43:58

标签: fortran naming-conventions

完全除了讨论编程语言是否应该区分大小写[1] [2]之外,对于不区分大小写的语言,什么是良好的命名约定?

具体来说,我在Fortran工作,但最常用的样式指南适用于区分大小写的语言,因此建议使用以下命名约定:

  • 班级/类型名称为CapitalizedWords
  • 方法/函数名称为firstWordNotCapitalized
  • 变量为lower_case_with_underscores
  • 常量为ALL_CAPS_WITH_UNDERSCORES

但是在不区分大小写的语言中,一切都是有效的全部大写,所以唯一可靠地使用多个单词的方法是ALL_CAPS_WITH_UNDERSCORES。那么我唯一的选择是区分名称的“种类”以回归匈牙利表示法吗?

  • 班级/类型名称为APPENDED_WITH_T
  • 方法/函数/子例程名称为APPENDED_WITH_{F or S}
  • 模块名称为APPENDED_WITH_M
  • 变量名称为NOT_APPENDED(常量只是变量)

名称冲突是Fortran中的一个主要问题,因为即使模块名称也会导致与变量名称或派生类型名称冲突。这是一个案例,即使每个人都说匈牙利符号是一个坏主意,在这种情况下它是否有意义?

编辑:

作为对评论的回应,例如,在区分大小写的语言(例如C ++)中,我可以做这样的事情:

在名为Logger.cc的文件(即模块)中:

class Logger {
    Logger(some type, of arguments) {...}
    log(some argument) {...}
}

在另一个文件中:

#include "Logger.h"
void aFunctionThatCreatesALogger() {
    ...
    Logger logger = new Logger(with, arguments)
    ...
}

void functionThatLogs(Logger logger) {
    ...
    logger.log(thing)
    ...
}

等效的Fortran看起来像:

在文件中(即模块名称Logger.f90):

module Logger

type Logger
contains
    procedure :: log
end type

contains

type(Logger) function Logger(some, arguments) result(logger)
logger%some = some
logger%arguments = arguments
end function Logger

subroutine log(logger, argument)
class(Logger) :: logger
type(some), intent(in) :: argument
...
end subroutine log

end module Logger

在另一个文件中:

module someModule

use Logger, only: Logger, Logger

contains

subroutine routineThatCreatesALogger()
type(Logger) :: logger
...
logger = Logger(with, arguments)
...
end subroutine routineThatCreatesALogger

subroutine routineThatLogs(logger)
type(Logger), intent(in) :: logger
...
call logger%log(thing)
...
end subroutine routineThatLogs

end module someModule

但当然模块名称,类型名称,“构造函数”函数和我的变量名之间的名称冲突都是一个问题,因为Fortran无法分辨案例和/或使用上下文之间的区别。

我完全理解任何建议都是非常主观的,但如果有人提出比匈牙利符号更好/不同的建议,我仍然会喜欢这里。

2 个答案:

答案 0 :(得分:1)

我很确定命名约定中案例变化的主要原因是给人类读者提示该名称的含义,而不是避免名称冲突。

因此,除非您的编译器真正仅支持大写名称,否则即使在不区分大小写的语言中,您也可以采用通常的约定。

如果名字冲突确实开始成为一个问题,使用前缀或后缀(后者最可能更可取)可能没问题,但我不会将其作为一般的强制性约定,但只是在它使用的时候才能使用需要的。
而且(特别是)如果你确实只是偶尔使用它们,那么最好使用不言自明的东西而不是单个字母或奇怪的首字母缩略词。

您的示例aFunctionThatCreatesALoggerfunctionThatLogs,如果它们被视为名称提案,可能实际上并不是他们乍一看似乎的怪物(如果偶尔使用),但我认为它是更好地从最相关的术语(日志)开始,并将最终的说明符放在最后(例如loggerCreatingFunctionloggerFunction)。

是否使用完整的,扩展的术语,缩写/首字母缩写词或甚至单个字母,主要取决于大多数开发人员是否使用具有良好自动完成功能的工具。

但是你应该总是谨慎使用这些说明符,最好尽可能避免这样的事情。
因此,如果您编写了声明使用它们的名称的代码,请在提交之前考虑三次。

请注意,我不知道Fortran(但是我确实使用了另一种不区分大小写的语言)。

答案 1 :(得分:0)

我很确定我会坚持我最初的想法。将_t附加到类型名称,并且在模块包含具有相同名称的内容的情况下,将_module附加到模块名称。除此之外,我将坚持共同的惯例:

  • 类/类型名称为CapitalizedWords
  • 方法/函数名称是firstWordNotCapitalized
  • 变量是lower_case_with_underscores
  • 常量为ALL_CAPS_WITH_UNDERSCORES

这应该避免绝大多数命名冲突并且(希望)产生可读代码。

上面的Fortran示例将成为:

module Logger_module

type Logger_t
contains
    procedure :: log
end type

contains

type(Logger_t) function createLogger(some, arguments) result(logger)
logger%some = some
logger%arguments = arguments
end function createLogger

subroutine log(logger, argument)
class(Logger_t) :: logger
type(some_t), intent(in) :: argument
...
end subroutine log

end module Logger

module some_module

use Logger_module, only: Logger_t, createLogger

contains

subroutine routineThatCreatesALogger()
type(Logger_t) :: logger
...
logger = createLogger(with, arguments)
...
end subroutine routineThatCreatesALogger

subroutine routineThatLogs(logger)
type(Logger_t), intent(in) :: logger
...
call logger%log(thing)
...
end subroutine routineThatLogs

end module some_module

当然,这忽略了一个问题,即你是否应该使用一个依赖于不区分大小写语言的案例的约定,但这就是真正邀请自以为是和主观论点的问题,所以我不会问它。