Упрощение инструкции switch

#dart

#dart

Вопрос:

Я хотел бы обобщить приведенный ниже код, чтобы сделать его меньше и красивее.

У меня есть 5 моделей ( User , Group , Event , Member , Appearance ), три показаны ниже.

Я хотел бы упростить код.

   String getId(uri) {
    String pathSegment;
    if (uri.pathSegments.length >= 2) {
      pathSegment = uri.pathSegments[1];
    } else {
      return null;
    }
    switch (resource) {
      case 'users':
        for (User user in models[resource]) {
          if (user.id == pathSegment) {
            return pathSegment;
          } else {
            return null;
          }
        }
        break;
      case 'groups':
        for (Group group in models[resource]) {
          if (group.id == pathSegment) {
            return pathSegment;
          } else {
            return null;
          }
        }
        break;
      case 'events':
        for (Event event in models[resource]) {
          if (event.id == pathSegment) {
            return pathSegment;
          } else {
            return null;
          }
        }
        break;
      default:
        break;
    }
    return null;
  }
 

Комментарии:

1. Вы можете заменить весь свой блок switch-case только этим: return ((models[resource].firstWhere((it) => it.id == pathSegment, orElse: () => null)) != null) ? pathSegment : null;

Ответ №1:

Если ваши User , Group , и Event имеют общий id , то вы можете упростить свой код с помощью dynamic type . Смотрите соответствующую документацию.

 String getId(uri) {
  String pathSegment;
  if (uri.pathSegments.length >= 2) {
     pathSegment = uri.pathSegments[1];
  } else {
    return null;
  }

  return _getIdFromItems(models[resource], pathSegment);
}

String _getIdFromItems(List<dynamic> items, String pathSegment) {
   for (dynamic item in items) {
     if (item.id == pathSegment) {
       return pathSegment;
     } else {
       return null;
     }
   }
   return null;
}
 

Комментарии:

1. Обратите внимание, что это предполагает, что не существует других значений для resource where item.id == pathSegment , которые могли бы быть удовлетворены. В исходном коде возвращалось бы значение, resource отличное от 'users' , 'groups' , и 'events null .