광어네 맛집
[Objective C] Static Method & Overloading 본문
[Objective C] Static Method & Overloading
Lautner Jacob 2022. 9. 30. 10:27지금 잘못되어 있는 로직 변경이랑 회사 이슈 때문에
요즘 글 쓸 시간도 없는 ㅠㅠ
무튼 이번 포스팅은 Objective C 레거씨 코드 뿌시기!
상황 : BaseViewController를 모든 ViewController 가 상속받고
BaseViewController 안에는 화면 이동 메서드를 넣어두고 이동할 때마다 사용함
->
리펙토링 : Transfer + Utils 를 추가하여 Class method로 리펙토링
BaseViewController 를 상속받아 사용하는 게 나쁜게 아니지만
해당 프로젝트에서는 중복코드도 많고, 쓰지 않는 BaseViewController 메서드를 굳이 받아야하나?
라고 항상 의문이 생겼었다!
대충 이전 개발자 분의 의도는 알겠으나 Static Method 로 만들면 훨씬 좋을 것 같아 리펙토링을 시작했다
리펙토링을 하면서 두가지 문제점이 있었는데
문제 1. 불필요한 메서드 상속
문제 2. 데이터를 전역에서 사용하기 위해 UserDefault 에 저장 ( + 홈 화면에서 같은 API를 7번 호출.. )
위에 문제점들 중 하나하나 어떻게 뜯었는지 회고하고자...
문제 1. 불필요한 메서드 상속
우선 NSObject 로 Transfer + Utils 파일을 하나 만들고 BaseViewController 에 있는 메서드를 Static 으로 변경했다
Swift 에서는 static func methodName ~ 이런식으로 작성한다면 Objective C도 간단하다
( 메서드명이나 파일 이름은 간단히 쓴거니 넘어가유ㅎ )
// 헤더 파일
#import <Foundation/Foundation.h>
@interface Transfer : NSObject
+ (BOOL)isTrue;
+ (void)moveToViewController:(Service)name;
@end
// 메인 파일
#import "Transfer.h"
@implementation Transfer
+ (BOOL)isTrue {
...
}
+ (void)moveToViewController:(Service)name {
...
}
@end
이렇게 사용하면 #import 만 해주면 Static Method로 사용하실 수 있습니다!
[Transfer isTrue];
간단하게 해결!
문제 2. 데이터를 전역에서 사용하기 위해 UserDefault 에 저장
이거는 어떤 프로젝트인지 따라서 다를 수도 있지만 일단 지금 프로젝트에서는
서비스 별 실시간 갱신이 가능해야해서 어차피 통신할 네트워크면 그냥 method 파라미터를 하나 더 받기로 했다
네트워크가 오면 그 데이터는 가공하지 않고 그대로 가지고 있으며
가공은 Method 안에서만 실행한다 라는 생각을 중점으로 리펙토링을 진행했다
그래서 단순히 아래처럼 하는 게 아니라
+ (void)moveToViewController:(Service)name {
...
}
⬇
+ (void)moveToViewController:(Service)name networkData:(NSDicationary)data {
...
}
이렇게 변경해주었다!
그리고 7번 쏘는 통신은 4개로 줄였지만... 남겨진 주석을 참고하면 어떤게 안되어 이렇게 했다라는데
믿을 수 없는 주석이라 나중에 테스트해보고 추가 수정할 계획이다
이렇게 리펙토링을 하면서 사이드 이펙트를 고려 안할 수가 없는데
UserDefault 에 저장해두고 전역에서 쓰다보니
어디서 버그가 발생할지 몰라서 어쩔 수 없이 UserDefault 값을 계속 저장해두었다..
이건 서비스별 테스트와 Swift 컨버팅 작업을 하면서 조금씩 뜯어내야겠다!
이 글이 Objective C 레거시를 없애는데 도움이 되면 좋겠어요!
그럼 이만!