津津's profile溪流漫话BlogLists Tools Help

Blog


    8/10/2009

    激进一点点还是保守一些?

    最近觉得 RD 和 QA 是天敌……老是被鸡蛋里挑骨头,而且经常不得不承认,这的确是骨头。

    有个比较郁闷的是,对一些需求上不怎么明确的、可算可不算的问题,总被拿另一个项目当参照物:XXX里是怎样的?XXX里做到了,所以也必须做到……有时候看上去更像是 QA 在提需求了。

    说实话这让我感到很压抑。进而想到一个基本原则问题——碰到某些用的不太顺手的东西,该果断采用新技术呢,还是沿用原先的一套?后者的好处是,大多数不太好解决的问题,都可以规避掉,因为“原先的XXX也没做到”,而坏处是,要永远这么吃力下去;前者的好处是,可能可以解决掉大多数问题,但是一旦遇到一个不好解决的问题,压力就会很大——谁叫你当初推崇用这个的呢?

    有说,“保守是混日子,激进是干大事,自觉得有能力就干大事,没能力就混吧”。是啊,我算什么呀,我何德何能去审视一些不该由我去关心的东西呢?可是呢,老这么混,自己也会觉得意思不大,而且拿XXX当挡箭牌的时候,自己也觉得自己很无耻,这是一个“朝气蓬勃”的人所该有的态度吗?或者……1、3、5保守,2、4、6激进?

    突然强烈地感到出来混太早,毕业得太快,灰常灰常后悔最后一个学期没有好好享受清福了……

    8/5/2009

    Visual Studio 2010 及 C++ 0x、C# 4.0(二)

    前面说到 C++ 0x 的 Lambda 表达式,前几天我总是感觉它缺了点什么,但说不出来。
    现在觉得可能可以表达出来了。那就是,C++ 中没有明确的“委托”类型。
    (为了表达这个概念,又不与 C++ 中已有概念混淆,这里请允许我使用 C# 中的名词。)
     
    其实也不是没有,C++ 的函数指针其实就是形式上很精确的“委托”类型。虽然它归根结底却是一个模糊得不能再模糊的普通指针而已,但起码,一个这样的函数放在那里:

    void sort(int arr[], int size, bool (*comparer)(int, int));

    给人的信息是非常明确且严格的。
    但是如上篇所试验,不能像这样传入 Lambda 表达式:

    sort(arr, N, [](int a, int b){ return a >= b; });

    而只能先定义一个小函数,然后使用:

    bool greater_than(int a, int b)

    {

        return a >= b;

    }

    sort(arr, N, greater_than);

    但是 Lambda 的引入,不就是为了解决这种小函数的问题的吗?
    另外,如果把函数改为

    template <typename T>

    void sort(int elem[], int n, T comparer); 

    这样,虽然(可能)确实可以 sort(arr, N, [](int a, int b){ return a >= b; }); ,
    但是实际使用的时候,我却不能知道 comparer 到底要符合什么样的形式。
     
    而 C# 中,由于有明确的委托类型存在,这种问题也就不存在了:

    delegate bool BinaryIntComparer(int a, int b);

    void sort(int[] arr, BinaryIntComparer comparer);

    使用的时候:

    sort(arr, (int a, int b) => a >= b);

     
    所以,对于 C++ 0x 来说,作为语法糖的 Lambda,似乎还不够甜……
     
    ==============================华丽的分隔线==============================
    今天随意看了一下 C# 4.0 的特性。所谓的协变性和逆变性一下子还看不明白。。。(果然 C# 是用来玩设计的)
    动态特性倒是理解了一点点:
     

    class Plane

    {

        public void Fly()

        {

            Console.WriteLine("Plane flies.");

        }

    }

     

    class Car

    {

        public void Run()

        {

            Console.WriteLine("Car runs");

        }

    }

     

    class Bird

    {

        public void Fly()

        {

            Console.WriteLine("Bird flies.");

        }

    }

     

    class Program

    {

        static void LetItFly(dynamic thing)

        {

            try

            {

                thing.Fly();

            }

            catch

            {

                Console.WriteLine("Method \"Fly()\" does not exists.");

            }

        }

     

        static void Main(string[] args)

        {

            LetItFly(new Plane());

            LetItFly(new Car());

            LetItFly(new Bird());

        }

    }

     
    结果:
    Plane flies.
    Method "Fly()" does not exists.
    Bird flies.
     
    我们所折腾的就是被声明为 dynamic 类型的 thing。“thing.Fly();”中的句点后面可以随意写个方法名称,编译的时候不来检查,到运行的时候才检查。
    如果没有 dynamic,参数就要被声明为 object,然后根据反射特性,去查询 Fly 方法有没有……
    看起来 dynamic 只是把这一堆繁琐的过程省略了。
     
    至于网上牛人们说的动态语言静态语言大融合这高度上的东东,我暂时是没有体会到,大概是我动态语言没怎么玩过的缘故吧。。。呃……JavaScript 也是动态语言?我怎么没感觉呢。。。