Skip to content

Latest commit

 

History

History
154 lines (116 loc) · 7.04 KB

programming-note.org

File metadata and controls

154 lines (116 loc) · 7.04 KB

Programming note

use existing codes much faster than inverstigating the details and write by oneself

Copy the existing codes should be the best way of programming. This is the most important lesson a programmer should learn.

BY use pcs(astropeak’s code snippets), copy is easy!! When I want to writting codes that detect the src blocks’s mode in an org file, I found related codes in ‘evil-nerd-commenter’, so I search ‘org-mode’ there, and found the codes. Then I create a snippet for that codes, and use in my project. very #GOOD PRACTICE#.

basic object interface

Ideas comes when implementing perl module Aspk::Tree.

  1. new. create an object
    my $n = Aspk::Tree->new({data=>"aaaa"});
        
  2. _prop. set a property value or get a property.

    Usage:

    # set property value
    $self->_prop(data, $spec->{data});
    $self->_prop(parent, undef);
    
    # get property value if second parameter not given
    $self->_prop(parent);
        

    Implementation:

    sub _prop {
        my ($self, $name, $value) = @_;
        if (defined($value)) {
            $self->{"_$name"} = $value;
            return $self;
        } else {
            return $self->{"_$name"};
        }
    }
        

new 和 _prop函数与之前的对象的生与死中的想法相同: 即创建对象与配置对象应该分开。

关于对象的生与死

做tooltip , selectlist 的一些想法,目前并不是很好用,每次都要重新创建一下,不太好。 对象需要提供的最基本的接口

  1. 创建 生成一个空的对象,填充所有的静态信息。 如果需要,可以调用配置接口接置动态信息,但这个配置接口必须独立。
  2. 配置 设置、更新所有的动态信息
  3. 显示 显示这个对象
  4. 删除 删除这个对象

以上4个就是通常说的‘增删查改’吧,但强调了静态信息和动态信息的区别,及何时设置。

关于如何做好软件

Thu Apr 28 10:07:28 2016 感觉软件不好,可以先放一下,之后再改进。只要坚持,就一定能够做好。 前提是代码要整理好,这次写wubi-app感觉就是这样,一开始运行效率有问题,尝试了一些方法,效果不佳,都不想继续做下去。就几天没管。几天后再尝试,居然一下就改好了。其实之前已经改得差不多了,只需要这最后一步,但当时已经MENG了。

编程方法

自底向上

我习惯于自底向上编程。 如果底层没有实现好,则我不能够很好地思维上层的编写过程。 这点我感觉不好。

先想后编

先想好怎么编,然后再开始敲代码,效率较高。call-stack实现时采用的方法,确实有效。

数据过滤链

定义call-stack语法表时想到。

将异形数据过滤/转换为理想数据,核心算法只针对理想数据处理,则核心处理算法将得到简化。

编译器的编写就采用了这种方法。

一个过滤器处理一种异形。

理想数据没有任何特殊情况。

可以定义一个Aspk::Filter的类,用于处理这种情况。 new时,添加源数据(可能也需要添加迭代器); 提供添加filter函数的方法。 TODO: 实现Aspk::Filter.

github

github上信息给纷杂。 awesome系列文章(curation for some topics), pondal的一些文章。 https://github.com/sindresorhus/awesome/blob/master/awesome.md

https://github.com/phodal

开源软件:

  • 提供不同产品线
  • 提供服务
  • 提供附加产品
  • donation

关键的是先提高影响力。向头条发文章,做有影响力的软件,写文章。

pondal 的 awesome-iot中的关于 home automation中可以看一下。可以先选个方向研究下。

OOP

解决条件判断的问题。 一种判断对应一组派生类对象,虚函数将这些连接在一起。

OOP and if conditional http://stackoverflow.com/questions/7264145/if-less-programming-basically-without-conditionals

软件设计

目前太过于关注具体小的实现了,整体设计训练太少。

案例研究

聊天软件设计

  1. 界面 界面=模板(静态)+数据(动态)。 因此界面模块对外只需要提供一个 update 接口就行了,用于更新动态数据。这是界面第一层。

    界面还应该包括一层:各个数据的 update关系。比如update了控件A,控件B也需要update。这是第二层。

worse is better

https://en.wikipedia.org/wiki/Worse_is_better

完美主义者:什么时候都完不成。是一件坏事情。

提倡快速实现, 即使有缺陷。

软件工程

改变软件开发方法

改变方法论, programming by poking, instead of by creating everything. 将软件组件组合起来,以达到目的。组合创新。

来源: Gerry Sussman: why MIT stopped teaching SICP. 当今软件开发模式已改变,90年代是通过将大系统分割为小部分,每个部分程序员都非常清楚,并且亲自编写;而如今是通过组合不同的库。程序员对库及硬件可能根本不清楚(或者不需要清楚)。 为什么会产生这种变化呢? => ? 软件规模越来越大,程序本来就更加复杂了。用原有的方式只能写出小、简单软件,要构造现代软件,必须用新的方法,也即基于已有软件。

adapter模式可能发挥作用。

错误: 在软件开发过程中,无法忍受未知,因此只能自底向上。要会定义问题。

不要再造轮子

  1. 一味造轮子,无法赶上时代发展,进步将很慢,在做无用功。
  2. 和他人无法竞争。别人站在巨人的肩膀上,你从最底层造起,谈何竞争?
  3. 出活太慢

迭代器思路不错

在编写call-stack时, 从文件中读取字节,使用了迭代器接口,后来将token也做成了迭代器。没有下标操作,要好用很多。

流程和动作分离

Thu Aug 25 09:39:46 2016

将程序运行的流程(或者框架)与具体动作分开实现。

  1. 代码会更清楚。
  2. 流程代码可以复用。

在实现 modify readme 时,使用了这个方法,实现了一个ProcessFiles的流程类,这个类决定什么时候做什么事情,但不会真正去做事情,而时提供出接口,让使用者定义怎么做。流行的框架都是这样的,如windows编程的中onCreate, onOpen等接口,都在在框架中定义的接口。

是否所有的软件都可以采用这个方法?