我知道函数独立于任何类,并且静态方法附加到类上。看起来他们两个都达到了相同的目标。这引出了以下问题:它们的优缺点是什么?
我想为离线PIN配置创建一组功能,例如setPin
,changePin
,verifyPin
。我是否必须将它们作为静态方法包装在类中?还是可以将它们作为函数创建在Dart文件中?
答案 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);
}