| 
 | 
 
前言 
 
Fortran编程已经步入第四年了,再过几年就可能干不动了,总结一下自己的编程经验。 
最近越发爱上了模块化、对象化代码编程,想着先在知乎上更新几篇用于面向对象编程的Fortran心得。 
我不知道面向对象是什么概念,理论不足,准备做一个民科。 
我理解的Fortran面向对象 
 
Fortran是高性能语言,与C/C++十分相似,但是在数组数学上做了长远的尝试,但同时比较固执,向后兼容性不止困扰着C++开发者,Fortran亦如此。 
写Fortran的时候,你可能会过于担心编码风格、养成很好的变量域控制,但我推荐粗暴些。但是粗暴些的话,代码量一旦上去了,容易杂乱无章,大量的函数、变量,管不过来! 
面向对象是一个好的方式,将函数与数据归类、暴露!(OOP三大特征之一:封装) 
 
- 在写数学函数,一般采用纯函数写法就行;
 
 - 其它,一般涉及数学建模,建模就离不开积木,而且是有品质的积木,面向对象就是好手!
 
  基本数据类型与结构体 
 
编程中,无论是静、动态语言,数据类型是真实存在的,这是一种归类的艺术,我们一般有整型、浮点型、字符型等基本数据类型: 
 
- 1个苹果;
 
 - 重力加速度:9.806m/s^2;
 
 - 我叫“zoziha”。
 
  基本数据类型是单元,结构体是将单元组合在一起,开始变得多样而灵活,比如我叫“zoziha”,站在一个重力加速度为g的地球上: 
!> 人 
type person 
  character(128) :: name  !! 姓名 
  real(8) :: g  !! 重力加速度 
end type person 
type(person) :: p1 = person(name='zoziha', g=9.806_8)备注:不幸的是Fortran并不支持更完备的OOP范式,如print *, person(name='zoziha', g=9.806_8)%name。 
绑定例程 
 
数只是数,没有动作,它就是纯静态的数,我们需要动起来,我们可以为结构体绑定过程: 
module demo_person 
!> 人 
type person 
  character(128) :: name  !! 姓名 
  real(8) :: g  !! 重力加速度 
contains 
  procedure :: say_hello 
end type person 
type(person) :: p1 = person(name='zoziha', g=9.806_8) 
contains 
subroutine say_hello(self) 
  class(person), intent(inout) :: self 
  print *, 'Hello from ', name 
end subroutine say_hello 
end module demo_person通过procedure将例程say_hello绑定为person的方法,下次你就可以使用call p1%say_hello()来打招呼了。 
备注1:绑定例程需要使用关键字class而不是type,只有保留了class,你才知道你写的是OOP。 
备注2:Fortran使用%来访问方法和成员,因为.在Fortran被自定义操作符(如.and.)占用了! 
okay,爱玩Fortran的同学,第一部分内容就到这了。 |   
 
 
 
 |