Ruby 코드의 가독성을 높이기 위해 (인터페이스 편)
가독성
사람들은 프로그램의 원본 코드를 읽을 때 그 목적과 처리 절차를 이해하기 쉽다
당연하게 해야 할 일.
Formitter/Litter 사용
기본적으로 사용하지 않을 이유가 없으니 사용하세요.
다른 사람이 생각해줬으면 하는 거.
명확한 인터페이스
예를 들어 다음과 같은 "WebAPI에서 인증 토큰을 받기"클래스를 고려할 것입니다.
class AuthTokenRepository
def create(params)
Faraday.new.post('/api/v1/auth_token', params.to_json)
end
end
매개변수의 정의를 자세히 설명해 주세요.
"Params에서 지정한 내용은 이 URL의 API Reference를 보십시오."댓글을 남겨주시면 좋을 것 같아요.
위의 메소드 정의에서는 "어떤 매개변수를 통과시킬지"를 전혀 알 수 없습니다.
리뷰가 있더라도 API 정의를 확인하는 데 시간이 걸립니다.
나는'학급/방법 정의만 읽으면 사용할 수 있다'는 것이 이상적인 상태라고 생각한다.
중복된 경우에도 매개변수를 세부적으로 정의합니다.
class AuthTokenRepository
def create(user_id:, password:)
Faraday.new.post('/api/v1/auth_token', { user_id: user_id, password: password }.to_json)
end
end
params가 끼면 어떡해요.
Faraday.new.post('/api/v1/auth_token', { user: { id: user_id, password: password } }.to_json)
→매개 변수로 표현할 필요가 없고 코드를 통해 필요한 요소를 읽어서 표현하면 된다.class AuthTokenRepository
def create(user_id:, user_password:)
Faraday.new.post('/api/v1/auth_token', { user: { id: user_id, password: user_password } }.to_json)
end
end
class AuthTokenRepository
class ValidationError < ::StandardError; end
def create(params)
raise ValidationError unless valid_params_for_create?(params)
Faraday.new.post('/api/v1/auth_token', params.to_json)
end
private
def valid_params_for_create?(params)
!(params.dig(:user, :id).nil? || params.dig(:user, :password).nil?)
end
end
루비 3.0 이후라면 제작
.rbs
파일 정의 유형도 괜찮다.내가 일하는 PJ가 좀 모자란 것 같아.
정상계의 반환값을 포장하다
그리고 문제.
Faraday::Response
의 실례이다팀 개발 서비스에 있어 새로 참여한 구성원들이 코드를 이해하는 데 장애가 된다.
봉인을 통해 상기 지식
AuthTokenRepository
을class에 숨깁니다.class AuthToken
def initialize(token:, expired_at:)
...
end
end
class AuthTokenRepository
def create(user_id:, password:)
response = Faraday.new.post('/api/v1/auth_token', { user_id: user_id, password: password }.to_json)
AuthToken.new(token: response.body['token'], expired_at: response.body['expired_at'])
end
end
정상적인 시스템 / 비정상적인 시스템의 오류를 압축합니다.
까먹었어.
Faraday::Error
의 하위 클래스이것에 대해서도 캡슐화하세요.
class AuthTokenRepository
class Error < ::StandardError; end
class FailedToCreateError < Error; end
class UnexpectedError < Error; end
def create(user_id:, password:)
response = Faraday.new.post('/api/v1/auth_token', { user_id: user_id, password: password }.to_json)
AuthToken.new(response.body)
rescue Faraday::ClientError => e
raise FailedToCreateError, e.message
rescue => e
raise UnexpectedError, e.message
end
end
부가: 캡슐화된 기쁜 부작용
포장을 통해 읽을 수 있을 뿐만 아니라
AuthTokenRepository
로 제한할 수 있음",변경에 대한 내성이 높아진 것이다.
# WebAPI のレスポンスフォーマットが変わった
class AuthTokenRepository
def create(user_id:, password:)
response = Faraday.new.post('/api/v1/auth_token', { user_id: user_id, password: password }.to_json)
AuthToken.new(
token: response.body['authToken']['token'],
expired_at: response.body['authToken']['expired_at']
)
rescue => e
# 省略
end
end
# DB を使いたい
class AuthTokenRepository
def create(user_id:, password:)
hashed_password = hash(password)
user = User.find_by!(user_id: user_id, password: hashed_password)
token, expired_at = create_token_for_user(user)
AuthToken.new(token: token, expired_at: expired_at)
rescue ActiveRecode::RecordNotFound => e
raise FailedToCreateError, e.message
rescue => e
raise UnexpectedError, e.message
end
end
Reference
이 문제에 관하여(Ruby 코드의 가독성을 높이기 위해 (인터페이스 편)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/epaew/articles/5a882a72ec94a2b96aea텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)