09 Mar 2025, 11:58
Refactoring เป็นกระบวนการปรับปรุงโค้ดให้สะอาดขึ้นโดยไม่เปลี่ยนพฤติกรรมของโปรแกรม ซึ่งช่วยให้โค้ดอ่านง่าย ดูแลรักษาง่าย และลดความซับซ้อน ในบทความนี้เราจะมาดูกันว่าเราสามารถรีแฟกเตอร์โค้ดใน Flutter ได้อย่างไร
1. แยก Widget ออกเป็น Component
โค้ด UI ที่มีขนาดใหญ่และอยู่ในไฟล์เดียวกันอาจทำให้ดูยุ่งยาก เราสามารถแยก UI ออกเป็น StatelessWidget หรือ StatefulWidget ตามความเหมาะสม
ตัวอย่างก่อน Refactor
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Home')),
body: Column(
children: [
Container(
padding: EdgeInsets.all(16),
child: Text('Welcome to Flutter!'),
),
ElevatedButton(
onPressed: () {},
child: Text('Click Me'),
),
],
),
);
}
}
หลังจาก Refactor
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Home')),
body: Column(
children: [
WelcomeText(),
CustomButton(),
],
),
);
}
}
class WelcomeText extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
padding: EdgeInsets.all(16),
child: Text('Welcome to Flutter!'),
);
}
}
class CustomButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: () {},
child: Text('Click Me'),
);
}
}
2. ใช้ Provider หรือ Riverpod จัดการ State
หากแอปของคุณมี state ที่ซับซ้อน ลองใช้ Provider หรือ Riverpod แทนการใช้ setState()
กับ StatefulWidget
เยอะเกินไป
ตัวอย่างการใช้ Riverpod
final counterProvider = StateProvider<int>((ref) => 0);
class CounterScreen extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final count = ref.watch(counterProvider);
return Scaffold(
appBar: AppBar(title: Text('Counter')),
body: Center(
child: Text('Count: $count'),
),
floatingActionButton: FloatingActionButton(
onPressed: () => ref.read(counterProvider.notifier).state++,
child: Icon(Icons.add),
),
);
}
}
3. ใช้ Extensions ช่วยลดโค้ดซ้ำซ้อน
Extensions ช่วยให้เราสามารถขยายความสามารถของ class ที่มีอยู่โดยไม่ต้องสร้างคลาสใหม่
ตัวอย่างการใช้ Extension Method กับ BuildContext
extension ContextExtensions on BuildContext {
void showSnackBar(String message) {
ScaffoldMessenger.of(this).showSnackBar(
SnackBar(content: Text(message)),
);
}
}
การใช้งาน
context.showSnackBar('Hello Flutter!');
4. จัดระเบียบโครงสร้างโค้ดให้ดี
features/home/
, features/auth/
home_screen.dart
, login_controller.dart
constants.dart
สำหรับค่าคงที่ที่ใช้ร่วมกันสรุป
การทำ Refactoring ช่วยให้โค้ดของเราดูแลรักษาง่ายขึ้น และทำให้ทีมสามารถทำงานร่วมกันได้อย่างมีประสิทธิภาพ ลองนำเทคนิคเหล่านี้ไปใช้ในโปรเจคของคุณ แล้วโค้ด Flutter ของคุณจะสะอาดและเป็นระเบียบมากขึ้น!