[util]Flutter의 클래스에서 variables, constructor, method 개수 세는 Python 스크립트 + 클래스 part로 쪼개기
지금 제가 프론트엔드를 맡고 있는 건 아니지만, 한 때 프론트엔드를 같이 했었던 만큼 오랜만에 프론트엔드 코드를 보고 싶어졌습니다.
claude code가 한 파일에서 읽는 코드 줄 수에 한계가 있어서 2000줄 정도 되면 잘 읽지 못합니다.
이런 경우 ai가 못해준다라고 포기하지 말고 코드를 쪼개서 읽게 하면 됩니다.
저는 part 와 extension으로 쪼갭니다.
원본 'original_class.dart'에
1
2
3
4
5
6
7
8
part 'extension_class1.dart'
part 'extension_class2.dart'
part 'extension_class3.dart'
class OriginalClass {
// variables
// constructors
}
이런 식으로 쪼개서 만들 extension클래스들을 part로 선언해주고, 각 extension에서는 예를 들어 'extension_class1.dart'에
1
2
3
4
5
6
7
part of 'original_class.dart'
extension ExtensionClass1 on OriginalClass{
// methods
// methods(setter)
// methods(getter)
}
이렇게 옮겨주시면 됩니다.
이렇게 하면 원본이 3000줄이면 part를 3개 나눠서 각각 1000줄씩 만들 수도 있겠죠?
**Flutter의 클래스에서 variables, constructor, method 개수 세는 Python 스크립트>
Claude code는 각 파일의 메소드가 몇개 있고 변수가 어떤 것들이 몇개 있는지를 세기 위해서는 코드 전체를 읽어야 합니다. 그러려면 토큰과 시간이 많이 듭니다.
그래서 python으로 유용한 스크립트를 만들어서 사용하면 좋을 것 같았습니다.
Flutter의 클래스 내에 있는 변수, 생성자, 메소드를 파악하면 리팩토링에 큰 도움이 될 것입니다.
https://gist.github.com/southglory/e7cebd99e9264919dfd1b8ecb38a945f
Dart/Flutter 파일에서 클래스, extension클래스에서 변수, 생성자, 메소드명을 추출하는 스크립트 Dart/Flutter 파일에서 클래스, extension클래스에서 변수, 생성자, 메소드명을 추출하는 스크립트 - extract_methods.py Dart/Flutter 파일에서 클래스, extension클래스에서 변수, 생성자, 메소드명을 추출하는 스크립트 - extract_methods.py
결과는 이렇게 됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
{
"file": "ai_book_provider_1.dart",
"total_variables": 0,
"total_constructors": 0,
"total_methods": 18,
"variables": [],
"constructors": [],
"methods": [
"setCanvasList",
"canvasBodyList (getter)",
"getOverImageSize",
"calcPagePhotoCountList",
"cancelAll",
"updateThumbVer",
"getThumbUrl",
"thumbUrlCover",
"thumbUrlPage",
"calendarFThumbUrl",
"leftPage",
"rightPage",
"resizeMaxSize",
"isFirstHalfPage",
"isLastHalfPage",
"isFirstHalfPageCurrent",
"isLastHalfCurrent",
"getThemeXaml"
]
}
variables, constructors도 있는 경우는,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
{
"file": "ai_book_provider.dart",
"total_variables": 112,
"total_constructors": 4,
"total_methods": 15,
"variables": [
"bookState",
"canvasState",
"photoState",
"uiState",
"syncState",
"bookRepository",
"photoRepository",
"designRepository",
"themeRepository",
"thumbnailRepository",
"isFetching",
"bookId",
"serverId",
"goodId",
"productId",
"goodName",
"coverId",
"title",
"author",
"leatherId",
"emptyCalendar",
"innerId",
"saveStatus",
"selectedTemp",
"isGaro",
"origCoverId",
"origEbookPageNum",
"service",
"bookTitle",
"duplicatedFlag",
"bookbackColor",
"logoImage",
"_editable",
"_coverEditable",
"_editCoverType",
"isPreview",
"tempLoadChk",
"pageAddOrDelete",
"pageName",
"tempJsonString",
"goodId2",
"_canvasList",
"currentCanvasIndex",
"canvasOverlayRatio",
"pageNavThumbList",
"referenceIndex",
"coverTemplate",
"firstPageTemplate",
"lastPageTemplate",
"_templatePages",
"puzzleTemplatePages",
"singlePrintTemplate",
"_photoList",
"webPhotoList",
"miniUrl",
"_selectedAssets",
"assets",
"_bigAssetList",
"_smallAssetList",
"tempEntityList",
"photoEntityList",
"selectedFrame",
"highlightFrame",
"multiSelectFrames",
"multiFrame",
"selectedIndex",
"selectedPageIndex",
"isMovingCenter",
"useCustomZoom",
"customZoomRatio",
"textEditCheck",
"resizeMoveCheck",
"webPhotoPickerLastScroll",
"layoutEditMenuLastScroll",
"calliEditMenuLastScroll",
"overPhotoListLastScroll",
"overTextListLastScroll",
"backgroundEditMenuLastIndex",
"stickerEditMenuLastIndex",
"backgroundEditMenuLastScroll",
"stickerEditMenuLastScroll",
"lastFontIndex",
"lastFontSize",
"isDialog",
"productInfoList",
"coverDataList",
"leatherDataList",
"backgroundList",
"stickerList",
"calliList",
"themeXamlList",
"layoutList",
"spLayoutList",
"spBackgroundList",
"frameDecoList",
"tempList",
"thumbVer",
"pageThumbList",
"thumbErrorMsg",
"pageThumbNum",
"_uploadFile",
"_onSuccess",
"_frameRotation",
"_frameCropPosition",
"_themeXamlFinished",
"_progressChanged",
"_uploadPageFinished",
"_uploadPhotoFinished",
"uploadItemProgress",
"isCancel",
"onXamlFinished",
"_stateListener"
],
"constructors": [
"AIBookProvider",
"AIBookProvider.copy",
"AIBookProvider.forEdit",
"AIBookProvider.forPuzzle"
],
"methods": [
"pageNum (getter)",
"pageCount (getter)",
"canvasList (getter)",
"currentCanvas (getter)",
"photoList (getter)",
"notDeletePhotoList (getter)",
"selectedAssets (getter)",
"usePhotoList (getter)",
"isHighlightedFrame",
"printPageType (getter)",
"fullLayoutList (getter)",
"halfLayoutList (getter)",
"bssValueOf",
"isBigAsset",
"isSmallAsset"
]
}
아주 유용하죠? ㅎㅎ
#part #extension #flutter #쪼개기 #리팩토링 #refactoring

