静态方法和函数的优缺点

时间:2019-05-28 07:10:40

标签: flutter dart

我知道函数独立于任何类,并且静态方法附加到类上。看起来他们两个都达到了相同的目标。这引出了以下问题:它们的优缺点是什么?

我想为离线PIN配置创建一组功能,例如setPinchangePinverifyPin。我是否必须将它们作为静态方法包装在类中?还是可以将它们作为函数创建在Dart文件中?

2 个答案:

答案 0 :(得分:1)

静态方法与函数之间没有清晰的“优点和缺点”。

正如您正确指出的那样,唯一的差异是静态成员连接到一个类。

class A {
  static bool b() => false;
}

bool c() => true;

这里唯一的区别是您需要通过A.b访问静态成员,并且可以直接访问c

静态方法是甚至不是继承的,这意味着class B extends A {}允许您使用B.b,因为b是的静态成员 A

话虽如此,@jamesdlin指出了一篇有关编写好的Dart设计的文章。 This article描述您应该避免只使用静态成员创建类,并称其为不良设计,即不习惯使用Dart:

  

在惯用的Dart中,类定义了各种对象。永远不会实例化的类型就是代码味道。

回到您的问题,如果根据Dart团队文章的惯用Dart设计,如果您的函数不是对象的一部分,则应该将它们创建为顶级函数。

但是,您可能会考虑更改存储“ PIN配置”的方式,因为这听起来像将这些信息存储为对象是理想的。

答案 1 :(得分:0)

我完全同意只使用带有静态方法的类是一个糟糕的设计决策。 它执行了面向对象原则,但实际上并没有带来面向对象的任何好处。

如果不能支持继承和多态,那还有什么意义? 另一方面,函数可以带来更大的灵活性,因为 dart 支持 javascript 等独立函数。

作为一个例子,让我们看看一个用于创建自定义主题的颤振类.. 此示例使用静态 getter..

import 'package:flutter/material.dart';

class CustomTheme {
  static ThemeData get lightTheme {
    return ThemeData(
      primarySwatch: Colors.purple,
      fontFamily: 'Quicksand',
      errorColor: Colors.purple,
      textTheme: ThemeData.light().textTheme.copyWith(
            headline6: TextStyle(
              fontFamily: 'OpenSans',
              fontSize: 18,
              fontWeight: FontWeight.bold,
            ),
            button: TextStyle(
              fontFamily: 'OpenSans',
              color: Colors.white,
              fontSize: 18,
            ),
          ),
      accentColor: Colors.indigo,
      appBarTheme: AppBarTheme(
        elevation: 12,
        textTheme: ThemeData.light().textTheme.copyWith(
              headline6: TextStyle(
                fontFamily: 'Quicksand-Bold',
                color: Colors.white,
                fontSize: 18,
              ),
            ),
      ),
    );
  }
}

考虑用这样的函数写这个..

import 'package:flutter/material.dart';

ThemeData myCustomLightTheme() {
  final ThemeData _lightTheme = ThemeData.light();

  final _appBarTheme = AppBarTheme(
    elevation: 12,
    textTheme: _lightTheme.textTheme.copyWith(
      headline6: TextStyle(
        fontFamily: 'Quicksand-Bold',
        color: Colors.white,
        fontSize: 18,
      ),
    ),
  );

  final _textTheme = _lightTheme.textTheme.copyWith(
    headline6: TextStyle(
      fontFamily: 'OpenSans',
      fontSize: 18,
      fontWeight: FontWeight.bold,
    ),
    button: TextStyle(
      fontFamily: 'OpenSans',
      color: Colors.white,
      fontSize: 18,
    ),
  );

  return ThemeData(
      primarySwatch: Colors.purple,
      fontFamily: 'Quicksand',
      errorColor: Colors.purple,
      textTheme: _textTheme,
      accentColor: Colors.indigo,
      appBarTheme: _appBarTheme);
}