Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix [#163] 릴리즈 QA 수정사항 2차 반영 #164

Merged
merged 10 commits into from
Mar 14, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion DontBe-iOS/DontBe-iOS/Global/Literals/StringLiterals.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ enum StringLiterals {
enum Write {
static let writeNavigationTitle = "새로운 글"
static let writeNavigationBarButtonItemTitle = "취소"
static let writeContentPlaceholder = "어떤 생각을 하고 있나요?"
static let writeContentPlaceholder = "무슨 고민이 있나요?"
static let writePostButtonTitle = "게시"
static let writePopupContentLabel = "작성 중인 글을 삭제하시겠어요?"
static let writePopupCancleButtonTitle = "취소"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
{
"images" : [
{
"filename" : "title_four.png",
"filename" : "title_fourth.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "title_four@2x.png",
"filename" : "title_fourth@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "title_four@3x.png",
"filename" : "title_fourth@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
Expand Down
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,5 @@ struct PostDetailResponseDTO: Decodable {
let likedNumber: Int
let commentNumber: Int
let contentText: String
let isDeleted: Bool
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 코드 패치는 꽤 안정적으로 보입니다. 몇 가지 주의 사항과 개선 제안은 다음과 같습니다:

  1. isDeleted 속성이 추가되었으나, 다른 속성들과의 일관성을 유지하기 위해 PostDetailResponseDTO의 초기화나 서드파티 생성자에서 해당 필드에 대한 처리가 필요합니다.
  2. 모든 속성이 let 상수이므로 변경할 필요가 없다면 var로 변경되어야 합니다.
  3. 코딩 스타일을 통일하기 위해 현재 세로 공백이 한 줄이므로 파라미터 다음에 세로 공백을 두 줄로 바꾸는 것이 좋습니다.

위 내용을 고려하여 코드를 수정하면 더 강력하고 읽기 쉬운 코드가 될 것입니다.

Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ final class HomeViewController: UIViewController {
var ghostReason: String = ""
var hasAppearedBefore = false

var transparentPopupVC = TransparentPopupViewController()
var transparentReasonView = DontBePopupReasonView()
var deletePostPopupVC = DeletePopupViewController(viewModel: DeletePostViewModel(networkProvider: NetworkService()))

Expand Down Expand Up @@ -125,7 +124,6 @@ extension HomeViewController {
private func setUI() {
self.view.backgroundColor = UIColor.donGray1

transparentPopupVC.modalPresentationStyle = .overFullScreen
deletePostPopupVC.modalPresentationStyle = .overFullScreen
}

Expand Down Expand Up @@ -215,7 +213,6 @@ extension HomeViewController {
private func setDelegate() {
homeCollectionView.dataSource = self
homeCollectionView.delegate = self
transparentPopupVC.transparentButtonPopupView.delegate = self
transparentReasonView.delegate = self
}

Expand Down Expand Up @@ -555,7 +552,25 @@ extension HomeViewController: UICollectionViewDataSource, UICollectionViewDelega
self.alarmTriggerType = cell.alarmTriggerType
self.targetMemberId = cell.targetMemberId
self.alarmTriggerdId = cell.alarmTriggerdId
self.present(self.transparentPopupVC, animated: false, completion: nil)

if let window = UIApplication.shared.keyWindowInConnectedScenes {
window.addSubviews(self.transparentReasonView)

self.transparentReasonView.snp.makeConstraints {
$0.edges.equalToSuperview()
}

let radioButtonImage = ImageLiterals.TransparencyInfo.btnRadio

self.transparentReasonView.firstReasonView.radioButton.setImage(radioButtonImage, for: .normal)
self.transparentReasonView.secondReasonView.radioButton.setImage(radioButtonImage, for: .normal)
self.transparentReasonView.thirdReasonView.radioButton.setImage(radioButtonImage, for: .normal)
self.transparentReasonView.fourthReasonView.radioButton.setImage(radioButtonImage, for: .normal)
self.transparentReasonView.fifthReasonView.radioButton.setImage(radioButtonImage, for: .normal)
self.transparentReasonView.sixthReasonView.radioButton.setImage(radioButtonImage, for: .normal)
self.transparentReasonView.warnLabel.isHidden = true
self.ghostReason = ""
}
}

cell.nicknameLabel.text = homeViewModel.postDatas[indexPath.row].memberNickname
Expand All @@ -577,6 +592,15 @@ extension HomeViewController: UICollectionViewDataSource, UICollectionViewDelega
cell.grayView.alpha = CGFloat(Double(-alpha) / 100)
}

// 탈퇴한 회원 닉네임 텍스트 색상 변경, 프로필로 이동 못하도록 적용
if self.homeViewModel.postDatas[indexPath.row].isDeleted {
cell.nicknameLabel.textColor = .donGray12
cell.profileImageView.isUserInteractionEnabled = false
} else {
cell.nicknameLabel.textColor = .donBlack
cell.profileImageView.isUserInteractionEnabled = true
}

self.contentId = homeViewModel.postDatas[indexPath.row].contentId

return cell
Expand All @@ -586,6 +610,7 @@ extension HomeViewController: UICollectionViewDataSource, UICollectionViewDelega
let destinationViewController = PostDetailViewController(viewModel: PostDetailViewModel(networkProvider: NetworkService()))
destinationViewController.contentId = homeViewModel.postDatas[indexPath.row].contentId
destinationViewController.memberId = homeViewModel.postDatas[indexPath.row].memberId
destinationViewController.userProfileURL = homeViewModel.postDatas[indexPath.row].memberProfileUrl
self.navigationController?.pushViewController(destinationViewController, animated: true)
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

코드 패치의 코드 리뷰:

  1. isDeleted 속성을 사용하여 회원이 탈퇴한 경우 셀의 닉네임 텍스트 색상을 변경하고 프로필 이미지 뷰의 상호작용 여부를 설정합니다. 이 부분은 안전하게 보입니다.

  2. destinationViewController에 새로운 속성 userProfileURL을 추가하여 해당 URL을 전달합니다. URL을 직접 전달하는 것은 좋은 방법입니다.

개선 제안:

  1. UI 변경으로 인해 닉네임 텍스트 색상 및 프로필 이미지 뷰의 상호작용 여부를 변경하는 로직은 View나 ViewModel에 있으면 더 좋을 수 있습니다.
  2. Magic string 대신에 .donGray12, .donBlack 같은 색깔 값들을 상수나 enum 혹은 리소스 파일에서 가져오는 것이 유지보수 면에서 좋을 수 있습니다.

Expand All @@ -600,35 +625,6 @@ extension HomeViewController: UICollectionViewDataSource, UICollectionViewDelega
}
}

extension HomeViewController: DontBePopupDelegate {
func cancleButtonTapped() {
self.dismiss(animated: false)
}

func confirmButtonTapped() {
self.dismiss(animated: false)

if let window = UIApplication.shared.keyWindowInConnectedScenes {
window.addSubviews(transparentReasonView)

transparentReasonView.snp.makeConstraints {
$0.edges.equalToSuperview()
}

let radioButtonImage = ImageLiterals.TransparencyInfo.btnRadio

self.transparentReasonView.firstReasonView.radioButton.setImage(radioButtonImage, for: .normal)
self.transparentReasonView.secondReasonView.radioButton.setImage(radioButtonImage, for: .normal)
self.transparentReasonView.thirdReasonView.radioButton.setImage(radioButtonImage, for: .normal)
self.transparentReasonView.fourthReasonView.radioButton.setImage(radioButtonImage, for: .normal)
self.transparentReasonView.fifthReasonView.radioButton.setImage(radioButtonImage, for: .normal)
self.transparentReasonView.sixthReasonView.radioButton.setImage(radioButtonImage, for: .normal)
self.transparentReasonView.warnLabel.isHidden = true
self.ghostReason = ""
}
}
}

extension HomeViewController: DontBePopupReasonDelegate {
func reasonCancelButtonTapped() {
transparentReasonView.removeFromSuperview()

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

코드 리뷰 및 개선 제안:

  1. 버그 위험:

    • setDelegate()에서 transparentPopupVC의 delegate 설정이 빠진 부분이 있습니다.
  2. 개선 제안:

    • transparentPopupVC 인스턴스 생성을 제거한 것은 좋은 점입니다.
    • 코드 중복을 줄이기 위해 유사한 코드를 함수로 추출하여 재사용하는 방법을 고려해 볼 수 있습니다.
    • 조금 더 읽기 쉽도록 변수 및 메소드명을 더 명확하게 지어주는 것이 도움이 될 수 있습니다.
    • 레이아웃 구성하는 코드와 이미지 설정을 섞어놓은 부분이 있어 가독성이 떨어집니다. 이를 분리하여 관리할 수 있도록 고민해보세요.
    • 코드 중복을 피하기 위해 삭제된 DontBePopupDelegate 프로토콜을 UICollectionViewDataSource와 연계하여 한번에 처리할 수 있는 방법을 고려해보시기 바랍니다.
  3. 일반적인 생각:

    • 코드베이스를 더 간결하고 유지보수가 쉽도록 만들기위해 항상 주의 깊게 검토하고 수정하는 것이 좋습니다.
    • Swift 디자인 가이드라인을 준수하여 일관된 스타일을 유지하는 것도 중요합니다.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,11 @@ extension MyPageContentViewController: UICollectionViewDelegate { }

extension MyPageContentViewController: UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
if self.contentDatas.count == 0 {
firstContentButton.isHidden = false
} else {
firstContentButton.isHidden = true
}
return self.contentDatas.count
}

Expand Down Expand Up @@ -339,7 +344,8 @@ extension MyPageContentViewController: UICollectionViewDataSource, UICollectionV

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let contentId = contentDatas[indexPath.row].contentId
NotificationCenter.default.post(name: MyPageContentViewController.pushViewController, object: nil, userInfo: ["contentId": contentId])
let profileImageURL = contentDatas[indexPath.row].memberProfileUrl
NotificationCenter.default.post(name: MyPageContentViewController.pushViewController, object: nil, userInfo: ["contentId": contentId, "profileImageURL": profileImageURL])
}

func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

코드 리뷰:

  1. numberOfItemsInSection 함수에서 self.contentDatas.count가 0이면 처음 컨텐츠 버튼을 숨기고, 그렇지 않으면 숨기지 않도록 하였습니다. 이것은 버그를 일으킬 수 있습니다. firstContentButton.isHidden 처리는 willDisplayreloadData 등 다른 적절한 시점에 발생해야 합니다. 데이터 변경 시 바로 처리하도록 하는 것이 좋습니다.

  2. collectionView(_: didSelectItemAt:) 함수에서 contentId 뿐만 아니라 profileImageURL도 함께 전달하도록 변경되었습니다. 이 부분은 안전하지만, 해당 키("profileImageURL") 값을 잘 설명하는 주석을 추가하는 것이 도움이 됩니다.

  3. 코드의 일관성을 위해 들여쓰기를 균일하게 유지하고 주석을 추가하여 각 메서드 및 확장의 목적을 명확히 할 수 있습니다.

  4. 코드에서 사용되는 메서드, 변수, 클래스의 이름이 명확하고 일관된지 확인하세요. 가독성을 높이는 데 도움이 됩니다.

  5. 각 기능이 정확히 무엇을 하는지 주석을 작성하여 코드를 이해하기 쉽게 만드세요.

  6. 에러 처리 및 예외 상황에 대한 고려가 충분히 되어 있는지 확인하세요.

  7. 코드 스타일 가이드에 따라 변수 및 함수의 네이밍을 개선할 수도 있습니다.

  8. 앱의 성능을 향상시키기 위해 필요한 경우 비동기 작업을 고려하세요.

  9. 클래스와 확장자에 대한 역할과 책임이 명확하게 나뉘어 있는지 확인하세요. 클래스가 너무 많은 책임을 가지지 않도록 구조화되어 있는지 검토해 보세요.

  10. 마지막으로, 유닛 테스트를 추가하여 각 메서드 및 기능이 의도한 대로 작동하는지 확인하세요.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,6 @@ final class MyPageViewController: UIViewController {
var deleteBottomsheet = DontBeBottomSheetView(singleButtonImage: ImageLiterals.Posting.btnDelete)
var warnBottomsheet = DontBeBottomSheetView(singleButtonImage: ImageLiterals.Posting.btnWarn)

var transparentPopupVC = TransparentPopupViewController()
var transparentReasonView = DontBePopupReasonView()
var deletePostPopupVC = DeletePopupViewController(viewModel: DeletePostViewModel(networkProvider: NetworkService()))

Expand Down Expand Up @@ -187,7 +186,6 @@ extension MyPageViewController {
private func setUI() {
self.view.backgroundColor = .donBlack

transparentPopupVC.modalPresentationStyle = .overFullScreen
deletePostPopupVC.modalPresentationStyle = .overFullScreen
}

Expand All @@ -207,7 +205,6 @@ extension MyPageViewController {
rootView.myPageScrollView.delegate = self
rootView.pageViewController.delegate = self
rootView.pageViewController.dataSource = self
transparentPopupVC.transparentButtonPopupView.delegate = self
transparentReasonView.delegate = self
}

Expand Down Expand Up @@ -475,7 +472,6 @@ extension MyPageViewController {
} else {
self.rootView.myPageContentViewController.noContentLabel.text = "\(data.nickname)" + StringLiterals.MyPage.myPageNoContentLabel
self.rootView.myPageCommentViewController.noCommentLabel.text = StringLiterals.MyPage.myPageNoCommentLabel
self.rootView.myPageContentViewController.firstContentButton.isHidden = false

saveUserData(UserInfo(isSocialLogined: true,
isFirstUser: false,
Expand All @@ -489,9 +485,10 @@ extension MyPageViewController {

@objc
private func pushViewController(_ notification: Notification) {
if let contentId = notification.userInfo?["contentId"] as? Int {
if let contentId = notification.userInfo?["contentId"] as? Int, let profileImageURL = notification.userInfo?["profileImageURL"] as? String {
let destinationViewController = PostDetailViewController(viewModel: PostDetailViewModel(networkProvider: NetworkService()))
destinationViewController.contentId = contentId
destinationViewController.userProfileURL = profileImageURL
self.navigationController?.pushViewController(destinationViewController, animated: true)
}
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

코드 리뷰를 해보겠습니다.

  1. 첫 번째 변경 사항:
    self.rootView.myPageContentViewController.firstContentButton.isHidden = false 해당 줄이 삭제되었습니다.

    • 변경 내용: 버튼에 대한 숨김 여부 설정이 삭제됨
    • 위험성: 해당 버튼이 의도치 않게 표시될 수 있음
    • 개선 제안: 필요에 따라 해당 버튼을 다른 방식으로 관리하거나, 왜 해당 코드가 제거되었는지 주석으로 설명
  2. 두 번째 변경 사항:
    if let contentId = notification.userInfo?["contentId"] as? Int, let profileImageURL = notification.userInfo?["profileImageURL"] as? String { 추가

    • 변경 내용: contentId와 profileImageURL 모두 확인 후 nil 체크
    • 위험성: contentId와 profileImageURL 중 하나라도 nil 일 경우, 빈 값을 처리할 로직이 없음
    • 개선 제안: nil 값일 경우의 처리 로직을 추가하여 예상치 못한 오류를 방지
  3. 일반적인 추천:

    • 코드의 가독성을 높이기 위해 변수 및 기능에 설명적인 이름 부여
    • 코드 주석 작성으로 다른 팀원들이 코드 이해를 돕기
    • 옵셔널 바인딩보다, guard 문 사용 권장

위 리뷰를 통해 코드 개선과 잠재적인 버그 사항을 처리하여 코드 안정성을 향상시킬 수 있습니다.

Expand Down Expand Up @@ -592,15 +589,51 @@ extension MyPageViewController {
self.alarmTriggerType = rootView.myPageContentViewController.alarmTriggerType
self.targetMemberId = rootView.myPageContentViewController.targetMemberId
self.alarmTriggerdId = rootView.myPageContentViewController.alarmTriggerdId
self.present(self.transparentPopupVC, animated: false, completion: nil)

if let window = UIApplication.shared.keyWindowInConnectedScenes {
window.addSubviews(transparentReasonView)

transparentReasonView.snp.makeConstraints {
$0.edges.equalToSuperview()
}

let radioButtonImage = ImageLiterals.TransparencyInfo.btnRadio

self.transparentReasonView.firstReasonView.radioButton.setImage(radioButtonImage, for: .normal)
self.transparentReasonView.secondReasonView.radioButton.setImage(radioButtonImage, for: .normal)
self.transparentReasonView.thirdReasonView.radioButton.setImage(radioButtonImage, for: .normal)
self.transparentReasonView.fourthReasonView.radioButton.setImage(radioButtonImage, for: .normal)
self.transparentReasonView.fifthReasonView.radioButton.setImage(radioButtonImage, for: .normal)
self.transparentReasonView.sixthReasonView.radioButton.setImage(radioButtonImage, for: .normal)
self.transparentReasonView.warnLabel.isHidden = true
self.ghostReason = ""
}
}

@objc
private func commentGhostButtonTapped() {
self.alarmTriggerType = rootView.myPageCommentViewController.alarmTriggerType
self.targetMemberId = rootView.myPageCommentViewController.targetMemberId
self.alarmTriggerdId = rootView.myPageCommentViewController.alarmTriggerdId
self.present(self.transparentPopupVC, animated: false, completion: nil)

if let window = UIApplication.shared.keyWindowInConnectedScenes {
window.addSubviews(transparentReasonView)

transparentReasonView.snp.makeConstraints {
$0.edges.equalToSuperview()
}

let radioButtonImage = ImageLiterals.TransparencyInfo.btnRadio

self.transparentReasonView.firstReasonView.radioButton.setImage(radioButtonImage, for: .normal)
self.transparentReasonView.secondReasonView.radioButton.setImage(radioButtonImage, for: .normal)
self.transparentReasonView.thirdReasonView.radioButton.setImage(radioButtonImage, for: .normal)
self.transparentReasonView.fourthReasonView.radioButton.setImage(radioButtonImage, for: .normal)
self.transparentReasonView.fifthReasonView.radioButton.setImage(radioButtonImage, for: .normal)
self.transparentReasonView.sixthReasonView.radioButton.setImage(radioButtonImage, for: .normal)
self.transparentReasonView.warnLabel.isHidden = true
self.ghostReason = ""
}
}

private func moveTop() {
Expand Down Expand Up @@ -717,56 +750,29 @@ extension MyPageViewController: UICollectionViewDelegate {

extension MyPageViewController: DontBePopupDelegate {
func cancleButtonTapped() {
if self.logoutPopupView != nil {
self.logoutPopupView?.removeFromSuperview()
} else {
self.dismiss(animated: false)
}
self.logoutPopupView?.removeFromSuperview()
}

func confirmButtonTapped() {
if self.logoutPopupView != nil {
self.logoutPopupView?.removeFromSuperview()
self.rootView.myPageBottomsheet.handleDismiss()

if let sceneDelegate = UIApplication.shared.connectedScenes.first?.delegate as? SceneDelegate {
DispatchQueue.main.async {
let rootViewController = LoginViewController(viewModel: LoginViewModel(networkProvider: NetworkService()))
sceneDelegate.window?.rootViewController = UINavigationController(rootViewController: rootViewController)
}
}

saveUserData(UserInfo(isSocialLogined: false,
isFirstUser: false,
isJoinedApp: true,
isOnboardingFinished: true,
userNickname: loadUserData()?.userNickname ?? "",
memberId: loadUserData()?.memberId ?? 0,
userProfileImage: loadUserData()?.userProfileImage ?? StringLiterals.Network.baseImageURL))
self.logoutPopupView?.removeFromSuperview()
self.rootView.myPageBottomsheet.handleDismiss()

OnboardingViewController.pushCount = 0
} else {
self.dismiss(animated: false)

if let window = UIApplication.shared.keyWindowInConnectedScenes {
window.addSubviews(transparentReasonView)

transparentReasonView.snp.makeConstraints {
$0.edges.equalToSuperview()
}

let radioButtonImage = ImageLiterals.TransparencyInfo.btnRadio

self.transparentReasonView.firstReasonView.radioButton.setImage(radioButtonImage, for: .normal)
self.transparentReasonView.secondReasonView.radioButton.setImage(radioButtonImage, for: .normal)
self.transparentReasonView.thirdReasonView.radioButton.setImage(radioButtonImage, for: .normal)
self.transparentReasonView.fourthReasonView.radioButton.setImage(radioButtonImage, for: .normal)
self.transparentReasonView.fifthReasonView.radioButton.setImage(radioButtonImage, for: .normal)
self.transparentReasonView.sixthReasonView.radioButton.setImage(radioButtonImage, for: .normal)
self.transparentReasonView.warnLabel.isHidden = true
self.ghostReason = ""
if let sceneDelegate = UIApplication.shared.connectedScenes.first?.delegate as? SceneDelegate {
DispatchQueue.main.async {
let rootViewController = LoginViewController(viewModel: LoginViewModel(networkProvider: NetworkService()))
sceneDelegate.window?.rootViewController = UINavigationController(rootViewController: rootViewController)
}
}

saveUserData(UserInfo(isSocialLogined: false,
isFirstUser: false,
isJoinedApp: true,
isOnboardingFinished: true,
userNickname: loadUserData()?.userNickname ?? "",
memberId: loadUserData()?.memberId ?? 0,
userProfileImage: loadUserData()?.userProfileImage ?? StringLiterals.Network.baseImageURL))

OnboardingViewController.pushCount = 0
}
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

코드 리뷰 및 개선 제안:

  1. 버그 위험:

    • 코드 내에 명시적인 버그는 보이지 않습니다.
  2. 개선 제안:

    • 초기화되고 사용되지 않는 transparentPopupVC 변수를 삭제한 것은 좋은 점입니다.
    • setUI() 함수에서 transparentPopupVC.modalPresentationStyle 설정 줄을 삭제했습니다. 이것은 필요 없는 코드라서 삭제하는 것이 좋습니다.
    • rootView 속성을 갖는 함수들에서 self.rootView 사용을 지속적으로 최소화하고 있습니다. 일관성 유지를 위해 모든 self. 참조를 확인하십시오.
    • 코드 중복을 줄이기 위해 commentGhostButtonTapped() 함수와 ghostReason 초기화 부분의 중복을 방지할 수 있는 방법을 고려해 보세요.
  3. 일반적인 피드백:

    • 코딩 스타일을 일관되게 유지하십시오.
    • 주석을 추가하여 복잡한 부분 또는 특정 설계 결정에 대한 이유를 설명할 수 있습니다.

코드는 보호 문제가 없어 보이나, 항상 코드 베이스를 테스트하여 예상대로 작동하는지 확인하십시오.

Expand Down
Loading