我是一名资深的C#开发人员,现在正在学习dart /Flutter 翼.在c#中,我更喜欢提前返回模式,例如:

private void myHandler()
{
    if (checkSomething())
    {
        doSomething();
        return;
    }

    if (checkSomethingElse())
    {
        doSomethingElse();
        return;
    }

    doRegularStuff();
}

这在DART中也被普遍认为是好的做法吗?我在DART中创建了以下键盘处理程序,灵感来自于我在网上找到的各种示例.对于格式,我使用了dart format命令行命令.老实说,我觉得真的很难看:

  /// Handles key presses.
  KeyEventResult _keyPressed(FocusNode node, KeyEvent event) {
    if (event is! KeyDownEvent) return KeyEventResult.ignored;
    if (event.isBarcodeChar()) {
      _keyboardBuffer.write(event.character);
    } else if (event.isBackspaceKey() && _keyboardBuffer.isNotEmpty) {
      String shortenedBuffer =
          _keyboardBuffer.toString().substring(0, _keyboardBuffer.length - 1);
      _keyboardBuffer.clear();
      _keyboardBuffer.write(shortenedBuffer);
    } else if (event.logicalKey == LogicalKeyboardKey.enter) {
      _codeScanned(_keyboardBuffer.toString());
      _keyboardBuffer.clear();
    } else {
      return KeyEventResult.ignored;
    }
    return KeyEventResult.handled;
  }

  /// Handles scaned barcodes.
  void _codeScanned(String code) {
    // Handle some stuff and update the state of the application
  }
}

_keyPressed方法返回handledignored时,它的代码并不清楚.它看起来也真的结成了一团.我还在c#中了解到,所有这else if条语句都有一股难闻的味道.那么,在DART中使用提前返回模式是否也是一个很好的练习呢?

附加问题:在DART中创建像My void _codeScanned()这样的一次性方法来提高可读性被认为是好做法吗?该方法只能从键盘处理程序内部使用,不能在其他地方使用.

官方的DART编码指南在这方面相当不清楚(或者我太愚蠢了,找不到合适的章节).因此,感谢您提前给予我们深刻的帮助.

推荐答案

使用提前退货模式并没有什么坏处.它被广泛使用,例如,你可以看看either_dart的套餐.

对于只调用一次的函数,我更喜欢使用内联函数.因此,我对您的代码进行了一些重构,使其更具可读性:

KeyEventResult _keyPressed(FocusNode node, KeyEvent event) {
  void _codeScanned(String code) {
    //
    _keyboardBuffer.clear();
  }

  bool canDoBackspace() =>
     event.isBackspaceKey() && _keyboardBuffer.isNotEmpty;

  bool isEnter() => event.logicalKey == LogicalKeyboardKey.enter;

  void doBackspace() {
    String shortenedBuffer =
      _keyboardBuffer.toString().substring(0, _keyboardBuffer.length - 1);
    _keyboardBuffer.clear();
    _keyboardBuffer.write(shortenedBuffer);
  }

  if (event is! KeyDownEvent) {
    return KeyEventResult.ignored;
  }
  if (event.isBarcodeChar()) {
    _keyboardBuffer.write(event.character);
  } else if (canDoBackspace()) {
    doBackspace();
  } else if (isEnter()) {
    _codeScanned(_keyboardBuffer.toString());
  } else {
    return KeyEventResult.ignored;
  }
  return KeyEventResult.handled;     
}

附注:您使用哪种集成开发环境?当您保存文件或运行项目时,VS代码可以执行自动套用格式.

Flutter相关问答推荐

如何等待抖动S定时器.定期取消?

如何在FiRestore中正确编写OR查询

如何使用flutter_local_notification包处理通知操作?

SingleChildScrollView在ErrorWidget.builder中不工作

使用ImageFilter模糊并剪裁同一renderObject中的元素

应为标识符,并应为查找)错误

了解多Provider 和流

找不到任何与 com.google.firebase:firebase-sessions:[15.0.0, 16.0.0) 匹配的版本

自定义绘画未显示 - Flutter

添加appBar时绘制的线条发生偏移 Flu

无法从一个页面导航到下一个页面 (Flutter)

在 Flutter 中更改喜欢按钮的 colored颜色

Flutter Flame OS 错误:使用音频文件 .wav 时出现该进程无法访问该文件,因为它正被另一个进程使用

Freezed+BLoc 如何从 BLoc Listener 查看当前状态和特定状态的变量

从子集合sem中获取参考学年&&课程名称的值

为什么 appBar 小部件在 flutter 中不是常量

为什么这个循环只发生一次?Flutter /dart

使用 hydrad_bloc 的预览包

在 Flutter 应用程序中全局使用 assets 文件夹

Flutter - 如何调用此函数?