由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 问个参数读入和传递的设计问题
相关主题
Python 可不可以一次读数据给一个 web service 后,然后一直用这个数据C++ 初学者请教一个 iostream 的问题
C++里面把数转成字符串的命令是啥啊?请问如何能让Qt(C++)中的浮点运算尽可能精确?
控制程序自动化执行, 该用 perl, python or shell script ?请教基本的时间输入的问题C++
C++中如何数据文件一起build进exe文件中?C++怎样从文件读入分数?
如何有效的用C/C++ 移动文件中的文本块?C++ 屏幕输入问题
问个C++的String问题ASIO TCP传送JSON如何知道包结束?
C++ string to int ProblemJSONCPP和ASIO能否联合使用(C++11)?
python读入文件疑问一个svn问题
相关话题的讨论汇总
话题: 参数话题: singleton话题: parameters话题: 读入话题: 对象
进入Programming版参与讨论
1 (共1页)
y**b
发帖数: 10166
1
看看能不能说的清楚:
科学计算程序,一次性从数据文件中读入很多参数,不同的(一个或几个相关参数)要传
递给不同的对象,很多对象还具有这种特点:初始化的时候只需要某些参数,其他动作
时还需要其他参数,比如空间一个多面体,初始化只需要空间坐标和密度等等,而后面
发生移动时还需要时间步长和重力加速度等等(时间步长和重力加速度逻辑上不应该是
该多面体的数据成员)。
第一,我是应该把时间步长/重力加速度等等作为该对象的成员,进行初始化;还是作
为该对象某个成员函数的的形参,想办法传入实参呢?
第二,我想设计一个class/struct来存储所有参数,以便MPI编程时用唯一一个进程来读
取参数,然后将这个存储参数的对象(通过boost.mpi)序列化并一次性broadcast给其他所
有进程(而不是一个参数一个参数地broadcast)。那么将包含所有参数的这个参数对象作
为实参,传递给任意一个只需要某些参数(而不是全部参数)的其它类的成员函数,是不
是很怪异呢?还是应该重新设计该成员函数的形参,使之仅仅获取所需要的参数,但这
样一来需要另行构造这些参数的类型?
谢谢。
p***o
发帖数: 1252
2

Try to put it as parameters first. If you find many member functions
are using this parameter later, then you know it should be changed
to a member. On the other hand, if one group of member functions
utilize this data while the other group don't, consider refactoring
your class into two.
来读
A popular way is to have a singleton to hold all configuration data, e.g. as
key/value pairs, and everyone else query it for parameters by name. Those
data,
as you mentioned before, could be read from a file and it makes sense to
broadcast in a distributed environment once at setup. You got great
flexibility
by not hard-coding all the parameters in that singleton class.

【在 y**b 的大作中提到】
: 看看能不能说的清楚:
: 科学计算程序,一次性从数据文件中读入很多参数,不同的(一个或几个相关参数)要传
: 递给不同的对象,很多对象还具有这种特点:初始化的时候只需要某些参数,其他动作
: 时还需要其他参数,比如空间一个多面体,初始化只需要空间坐标和密度等等,而后面
: 发生移动时还需要时间步长和重力加速度等等(时间步长和重力加速度逻辑上不应该是
: 该多面体的数据成员)。
: 第一,我是应该把时间步长/重力加速度等等作为该对象的成员,进行初始化;还是作
: 为该对象某个成员函数的的形参,想办法传入实参呢?
: 第二,我想设计一个class/struct来存储所有参数,以便MPI编程时用唯一一个进程来读
: 取参数,然后将这个存储参数的对象(通过boost.mpi)序列化并一次性broadcast给其他所

g*****g
发帖数: 34805
3
通常的做法是写成key/value pair,所谓的properties文件。
初始化的时候全部导入到一个hashmap里,用一个singleton维护
这个hashmap,需要的时候直接调。不需要把参数传来传去的。
既然参数是只读的,也不需要什么broadcast,不同进程读同一个
文件也是一样的。读一次文件的开销可以忽略不计。如果你有多个
结点,同样可以把这个文件拷到每个节点上。

来读
他所

【在 y**b 的大作中提到】
: 看看能不能说的清楚:
: 科学计算程序,一次性从数据文件中读入很多参数,不同的(一个或几个相关参数)要传
: 递给不同的对象,很多对象还具有这种特点:初始化的时候只需要某些参数,其他动作
: 时还需要其他参数,比如空间一个多面体,初始化只需要空间坐标和密度等等,而后面
: 发生移动时还需要时间步长和重力加速度等等(时间步长和重力加速度逻辑上不应该是
: 该多面体的数据成员)。
: 第一,我是应该把时间步长/重力加速度等等作为该对象的成员,进行初始化;还是作
: 为该对象某个成员函数的的形参,想办法传入实参呢?
: 第二,我想设计一个class/struct来存储所有参数,以便MPI编程时用唯一一个进程来读
: 取参数,然后将这个存储参数的对象(通过boost.mpi)序列化并一次性broadcast给其他所

N***m
发帖数: 4460
4
没看懂你想说什么,胡乱打个酱油撒。
时间步长啥的难道不是独立于模型的撒?

来读
他所

【在 y**b 的大作中提到】
: 看看能不能说的清楚:
: 科学计算程序,一次性从数据文件中读入很多参数,不同的(一个或几个相关参数)要传
: 递给不同的对象,很多对象还具有这种特点:初始化的时候只需要某些参数,其他动作
: 时还需要其他参数,比如空间一个多面体,初始化只需要空间坐标和密度等等,而后面
: 发生移动时还需要时间步长和重力加速度等等(时间步长和重力加速度逻辑上不应该是
: 该多面体的数据成员)。
: 第一,我是应该把时间步长/重力加速度等等作为该对象的成员,进行初始化;还是作
: 为该对象某个成员函数的的形参,想办法传入实参呢?
: 第二,我想设计一个class/struct来存储所有参数,以便MPI编程时用唯一一个进程来读
: 取参数,然后将这个存储参数的对象(通过boost.mpi)序列化并一次性broadcast给其他所

p*********t
发帖数: 2690
5
如果是一个大project,最好先用uml之类的把每个class都画出来,把class之间的关系
也写出来,如果有inheritance什么的,也标出来。这样更清楚些。

来读
他所

【在 y**b 的大作中提到】
: 看看能不能说的清楚:
: 科学计算程序,一次性从数据文件中读入很多参数,不同的(一个或几个相关参数)要传
: 递给不同的对象,很多对象还具有这种特点:初始化的时候只需要某些参数,其他动作
: 时还需要其他参数,比如空间一个多面体,初始化只需要空间坐标和密度等等,而后面
: 发生移动时还需要时间步长和重力加速度等等(时间步长和重力加速度逻辑上不应该是
: 该多面体的数据成员)。
: 第一,我是应该把时间步长/重力加速度等等作为该对象的成员,进行初始化;还是作
: 为该对象某个成员函数的的形参,想办法传入实参呢?
: 第二,我想设计一个class/struct来存储所有参数,以便MPI编程时用唯一一个进程来读
: 取参数,然后将这个存储参数的对象(通过boost.mpi)序列化并一次性broadcast给其他所

y**b
发帖数: 10166
6
多谢pptwo and goodbug! 按这个思路做了,感觉不错,有几个问题再请教一下:
1. 这个singleton维护的hashmap类似于一个全局变量,无需传递函数参数,
任何对象和函数都可以取用,很方便,可是总觉得有点特别。想问一下这样做
很普遍吗?有个实验室开发的一个大型面向对象程序包,读入数据之后进行了
无数的分离和传递,直到每个用到(不同数据部分)的对象都完全用local的数据
结构来维护所需数据,好处是各个对象显得high cohesion, 缺点是非常繁琐、
数据冗余很多。你们觉得那种设计更好?
2. pptwo: You got great flexibility by not hard-coding all the parameters
in that singleton class. 这句话怎么理解?我想把所有数据一次性读入到
该singleton class,这样失去flexibility?
3. 大量进程读(一次)一个小文件(比如singleton class存储的内容)开销不大,
但是读那些很大的数据文件开销可能很大。比如我在该singleton class里面指定
某个数据文件,该文件可能是很大的hdf5格式的文件,根进程读入该文件之后可以
将该文件的不同部分发往不同进程,这是比较通行的做法。如果我想让根进程读入
小文件到singleton class,能否将这个singleton也broadcast到其他进程呢?
Thanks.

要传
动作
后面
该是
是作

【在 g*****g 的大作中提到】
: 通常的做法是写成key/value pair,所谓的properties文件。
: 初始化的时候全部导入到一个hashmap里,用一个singleton维护
: 这个hashmap,需要的时候直接调。不需要把参数传来传去的。
: 既然参数是只读的,也不需要什么broadcast,不同进程读同一个
: 文件也是一样的。读一次文件的开销可以忽略不计。如果你有多个
: 结点,同样可以把这个文件拷到每个节点上。
:
: 来读
: 他所

g*****g
发帖数: 34805
7

整个JDK就是这么实现的。代码里很多地方都有System.getProperty,我相信
JDK比大多数C++系统在设计模式层面上做得更好。从技术层面上,配置属于
immutable的数据,local和global访问并无本质区别。
不是,他的意思是说你可以后面再加新的数据而不需要对singlton改动。
immutable的东西怎么传都行。

【在 y**b 的大作中提到】
: 多谢pptwo and goodbug! 按这个思路做了,感觉不错,有几个问题再请教一下:
: 1. 这个singleton维护的hashmap类似于一个全局变量,无需传递函数参数,
: 任何对象和函数都可以取用,很方便,可是总觉得有点特别。想问一下这样做
: 很普遍吗?有个实验室开发的一个大型面向对象程序包,读入数据之后进行了
: 无数的分离和传递,直到每个用到(不同数据部分)的对象都完全用local的数据
: 结构来维护所需数据,好处是各个对象显得high cohesion, 缺点是非常繁琐、
: 数据冗余很多。你们觉得那种设计更好?
: 2. pptwo: You got great flexibility by not hard-coding all the parameters
: in that singleton class. 这句话怎么理解?我想把所有数据一次性读入到
: 该singleton class,这样失去flexibility?

p***o
发帖数: 1252
8

I believe those C++ systems are mostly too old (or derived from C)
to have this flexible approach like JDK. On the other hand, it is
also possible to achieve such "high cohesion" by using something like
XPath that organizes key/value pairs into a hierarchy (I don't know
if JDK already does so in System.getProperty).
parameters

【在 g*****g 的大作中提到】
:
: 整个JDK就是这么实现的。代码里很多地方都有System.getProperty,我相信
: JDK比大多数C++系统在设计模式层面上做得更好。从技术层面上,配置属于
: immutable的数据,local和global访问并无本质区别。
: 不是,他的意思是说你可以后面再加新的数据而不需要对singlton改动。
: immutable的东西怎么传都行。

y**b
发帖数: 10166
9
搞定,再次表示感谢!

【在 g*****g 的大作中提到】
:
: 整个JDK就是这么实现的。代码里很多地方都有System.getProperty,我相信
: JDK比大多数C++系统在设计模式层面上做得更好。从技术层面上,配置属于
: immutable的数据,local和global访问并无本质区别。
: 不是,他的意思是说你可以后面再加新的数据而不需要对singlton改动。
: immutable的东西怎么传都行。

1 (共1页)
进入Programming版参与讨论
相关主题
一个svn问题如何有效的用C/C++ 移动文件中的文本块?
越南问题 谁做出来了?问个C++的String问题
数据库小白请教:如果数据库文件很大,MySQL和Python Pandas分C++ string to int Problem
技术问题探讨:数据处理python读入文件疑问
Python 可不可以一次读数据给一个 web service 后,然后一直用这个数据C++ 初学者请教一个 iostream 的问题
C++里面把数转成字符串的命令是啥啊?请问如何能让Qt(C++)中的浮点运算尽可能精确?
控制程序自动化执行, 该用 perl, python or shell script ?请教基本的时间输入的问题C++
C++中如何数据文件一起build进exe文件中?C++怎样从文件读入分数?
相关话题的讨论汇总
话题: 参数话题: singleton话题: parameters话题: 读入话题: 对象