퀴즈앱4; 캡슐화

장윤찬·2021년 11월 12일
0

goal : 캡슐화를 통해 앱을 안전하게 보호하자.

'quiz'객체의 'q'속성을main.dart파일에서 자유롭게 변경할 수 있다면, 앱은 안전을 보장하지 못한다.
예를들어, 다음의 상황을 가정해보자.

onPressed: () {
  quiz.q[questionNumber].questionanswer = true; // 추가한코드
  if (quiz.q[questionNumber].questionanswer == true) {
    print('correct');
  } else {
    print('not correct');
}

이와같이, 'quiz.q[questionNumber].questionanswer'에 'true'값을 임의로 치환한다면, 무조건 'correct'를 출력하게될것이다.

캡슐화를 통해 이를 방지할 수 있다.

속성'q' private 정의

우선quiz.dart파일의 'Quiz' 클래스의 'q'속성을 'private'으로 정의하자.
'dart'에서는 정의하려는 속성에 '__'를 붙히면 된다.

import 'question.dart';

class Quiz {
  List<Question> _q = ['''''];

이제 'q'는 'private'하므로 'q'가 속한 'Quiz' 클래스 내에서만 사용가능하다. ※ main.dart파일에서는 이제 'q'를 사용하지못한다.
즉, main.dart파일의 'q'가 적용된 부분들의 코드수정이 필요하다.

  • 변경전main.dart파일
child: Text(
  quiz.q[questionNumber].questiontext,
  '
  '
onPressed: () {
  if (quiz.q[questionNumber].questionanswer == true) {
    print('correct')
'
'
onPressed: () {
  if (quiz.q[questionNumber].questionanswer == false) {
    print('correct')

클래스내에 'private'속성 반환하는 함수 정의

'q'를main.dart파일 내에서 사용하지 못하므로quiz파일의 'Quiz' 클래스내에 함수를 추가하여 대체하자.

class Quiz {
'
'
'
String gettext(int questionNumber) {
  return _q[questionNumber].questiontext;
} // 'main.dart'파일의 'quiz.q[questionNumber].questiontext' 대체할 함수

bool getanswer(int questionNumber) {
  return _q[questionNumber].questionanswer;
}  // 'main.dart'파일의 'quiz.q[questionNumber].questionanswer' 대체할 함수

}

main.dart파일 수정

  • 변경된main.dart파일
'
'
child: Text(
  quiz.gettext(questionNumber),
  '
  '
onPressed: () {
  if (quiz.getanswer(questionNumber) == true) {
    print('correct')
'
'
onPressed: () {
  if (quiz.getanswer(questionNumber) == false) {
    print('correct')
'
'

'questionNumber' 변수 'private' 정의

main.dart파일의 'questionNumber' 변수를 'Quiz' 클래스내에서 'private'하게 정의하자.

class Quiz {
'
'
int _questionNumber = 0;
'
'

이제main.dart파일에서 'questionNumber' 변수를 사용하지 못하므로 'questionNumber' 변수가 적용된 코드는 수정이 필요하다.

  • 변경전 main.dart파일
'
'
child: Text(
  quiz.gettext(questionNumber),
'
'
onPressed: () {
  if (quiz.getanswer(questionNumber) == true) {
    print('correct')
'
questionNumber += 1;
'
'
onPressed: () {
  if (quiz.getanswer(questionNumber) == false) {
    print('correct')
'
questionNumber += 1;
'
'

클래스내에 'private'속성 이용하는 함수 정의

다음과 같이, quiz.dart파일의 'Quiz' 클래스를 다음과 같이 변경해주자.

class Quiz {
  List<Question> _q = ['''];
  int _questionNumber = 0;
  
  void addNumber() {
    if (_questionNumber < _q.length - 1) {
      _questionNumber++;
    }
  } // q의 길이는 13이므로 'questionNumber'는 13이상의 값을 가지면 에러를 유발한다.
  
  String gettext() {
    return _q[_questionNumber].questiontext;
  }
  
  bool getanswer() {
    return _q[_questionNumber].questionanswer;
  }
}

main.dart파일 수정

  • 변경후 main.dart파일
'
'
child: Text(
  quiz.gettext(),
'
'
onPressed: () {
  if (quiz.getanswer() == true) {
    print('correct')
'
quiz.addNumber();
'
'
onPressed: () {
  if (quiz.getanswer() == false) {
    print('correct')
'
quiz.addNumber();
'
'
profile
Flutter 학습 일기

0개의 댓글