질문을 삭제하지 말아주세요.!
 
1
0
-1


객체지향에 대해서 많은 공부를 하고 있는 중에

OP.GG Style Guides 를 보게되었습니다.

PHP Native Array 를 Dictionary 로써 사용하는 것을 지양하라고 나와있습니다.


Native Array 는 지양하고 최대한 객체를 생성하여 데이터를 관리하면 좋다고 하는데

어떻게 해야될지 감이 안잡힙니다.

현재 저희는 항공 API 를 다루면서 모든 데이터를 배열에 저장하고 있습니다.

예를 들면 아래와 같이 array 로 저장하고 관리하고 있는데 이것을 어떻게 객체를 생성하여 나눈다는것인지

잘 모르겠습니다.

예를 들어서 설명해주시면 정말 감사하겠습니다.



[100363800_KE_0] => Array
                (
                    [0] => Array
                        (
                            [ADT] => Array
                                (
                                    [Key] => XBlzbPBAAA/B/hZ5UAAAAA==
                                    [TotalPrice] => 363800
                                    [BasePrice] => 280000
                                    [ApproximateTotalPrice] => 363800
                                    [ApproximateBasePrice] => 280000
                                    [Taxes] => 83800
                                    [LatestTicketingTime] => 2018-06-09
                                    [PricingMethod] => Unknown
                                    [ETicketability] => Yes
                                    [PlatingCarrier] => KE
                                    [ProviderCode] => 1P
                                    [FareInfoRef] => Array
                                        (
                                            [0] => 
                                            [1] => 
                                            [0_attr] => Array
                                                (
                                                    [Key] => XBlzbPBAAA/B+hZ5UAAAAA==
                                                )

                                            [1_attr] => Array
                                                (
                                                    [Key] => XBlzbPBAAA/BDiZ5UAAAAA==
                                                )

                                        )

                                    [seg] => Array
                                        (
                                            [0] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [0] => Array
                                                                (
                                                                    [BookingCode] => Q
                                                                    [BookingCount] => 5
                                                                    [CabinClass] => Economy
                                                                    [FareInfoRef] => XBlzbPBAAA/B+hZ5UAAAAA==
                                                                    [SegmentRef] => XBlzbPBAAA/BJgZ5UAAAAA==
                                                                )

                                                        )

                                                )

                                            [1] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [0] => Array
                                                                (
                                                                    [BookingCode] => Q
                                                                    [BookingCount] => 9
                                                                    [CabinClass] => Economy
                                                                    [FareInfoRef] => XBlzbPBAAA/BDiZ5UAAAAA==
                                                                    [SegmentRef] => XBlzbPBAAA/BLgZ5UAAAAA==
                                                                )

                                                        )

                                                )

                                        )

                                    [via] => 0
                                    [TaxInfo] => Array
                                        (
                                            [0] => Array
                                                (
                                                    [Category] => BP
                                                    [Amount] => KRW28000
                                                    [Key] => XBlzbPBAAA/BAiZ5UAAAAAAA
                                                )

                                            [1] => Array
                                                (
                                                    [Category] => SW
                                                    [Amount] => KRW25000
                                                    [Key] => XBlzbPBAAA/BBiZ5UAAAAAAA
                                                )

                                            [2] => Array
                                                (
                                                    [Category] => YR
                                                    [Amount] => KRW30800
                                                    [Key] => XBlzbPBAAA/BCiZ5UAAAAAAA
                                                )

                                        )

                                )

                        )

                )

            [100384200_KE_0] => Array
                (
                    [0] => Array
                        (
                            [ADT] => Array
                                (
                                    [Key] => XBlzbPBAAA/BinZ5UAAAAA==
                                    [TotalPrice] => 384200
                                    [BasePrice] => 300000
                                    [ApproximateTotalPrice] => 384200
                                    [ApproximateBasePrice] => 300000
                                    [Taxes] => 84200
                                    [LatestTicketingTime] => 2018-06-09
                                    [PricingMethod] => Unknown
                                    [ETicketability] => Yes
                                    [PlatingCarrier] => KE
                                    [ProviderCode] => 1P
                                    [FareInfoRef] => Array
                                        (
                                            [0] => 
                                            [1] => 
                                            [0_attr] => Array
                                                (
                                                    [Key] => XBlzbPBAAA/B3iZ5UAAAAA==
                                                )

                                            [1_attr] => Array
                                                (
                                                    [Key] => XBlzbPBAAA/BOjZ5UAAAAA==
                                                )

                                        )

                                    [seg] => Array
                                        (
                                            [0] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [0] => Array
                                                                (
                                                                    [BookingCode] => E
                                                                    [BookingCount] => 9
                                                                    [CabinClass] => Economy
                                                                    [FareInfoRef] => XBlzbPBAAA/B3iZ5UAAAAA==
                                                                    [SegmentRef] => XBlzbPBAAA/BJgZ5UAAAAA==
                                                                )

                                                        )

                                                )

                                            [1] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [0] => Array
                                                                (
                                                                    [BookingCode] => Q
                                                                    [BookingCount] => 6
                                                                    [CabinClass] => Economy
                                                                    [FareInfoRef] => XBlzbPBAAA/BOjZ5UAAAAA==
                                                                    [SegmentRef] => XBlzbPBAAA/BegZ5UAAAAA==
                                                                )

                                                        )

                                                )

                                        )

                                    [via] => 0
                                    [TaxInfo] => Array
                                        (
                                            [0] => Array
                                                (
                                                    [Category] => BP
                                                    [Amount] => KRW28000
                                                    [Key] => XBlzbPBAAA/BjnZ5UAAAAAAA
                                                )

                                            [1] => Array
                                                (
                                                    [Category] => OI
                                                    [Amount] => KRW5100
                                                    [Key] => XBlzbPBAAA/BknZ5UAAAAAAA
                                                )

                                            [2] => Array
                                                (
                                                    [Category] => SW
                                                    [Amount] => KRW20300
                                                    [Key] => XBlzbPBAAA/BlnZ5UAAAAAAA
                                                )

                                            [3] => Array
                                                (
                                                    [Category] => YR
                                                    [Amount] => KRW30800
                                                    [Key] => XBlzbPBAAA/BmnZ5UAAAAAAA
                                                )

                                        )

                                )

                        )

                )

            [100385800_OZ_0] => Array
                (
                    [0] => Array
                        (
                            [ADT] => Array
                                (
                                    [Key] => XBlzbPBAAA/BsnZ5UAAAAA==
                                    [TotalPrice] => 385800
                                    [BasePrice] => 302000
                                    [ApproximateTotalPrice] => 385800
                                    [ApproximateBasePrice] => 302000
                                    [Taxes] => 83800
                                    [LatestTicketingTime] => 2018-06-09
                                    [PricingMethod] => Unknown
                                    [ETicketability] => Yes
                                    [PlatingCarrier] => OZ
                                    [ProviderCode] => 1P
                                    [FareInfoRef] => Array
                                        (
                                            [0] => 
                                            [1] => 
                                            [0_attr] => Array
                                                (
                                                    [Key] => XBlzbPBAAA/BZjZ5UAAAAA==
                                                )

                                            [1_attr] => Array
                                                (
                                                    [Key] => XBlzbPBAAA/BsjZ5UAAAAA==
                                                )

                                        )

                                    [seg] => Array
                                        (
                                            [0] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [0] => Array
                                                                (
                                                                    [BookingCode] => K
                                                                    [BookingCount] => 2
                                                                    [CabinClass] => Economy
                                                                    [FareInfoRef] => XBlzbPBAAA/BZjZ5UAAAAA==
                                                                    [SegmentRef] => XBlzbPBAAA/BggZ5UAAAAA==
                                                                )

                                                        )

                                                )

                                            [1] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [0] => Array
                                                                (
                                                                    [BookingCode] => Q
                                                                    [BookingCount] => 9
                                                                    [CabinClass] => Economy
                                                                    [FareInfoRef] => XBlzbPBAAA/BsjZ5UAAAAA==
                                                                    [SegmentRef] => XBlzbPBAAA/BjgZ5UAAAAA==
                                                                )

                                                        )

                                                )

                                        )

                                    [via] => 0
                                    [TaxInfo] => Array
                                        (
                                            [0] => Array
                                                (
                                                    [Category] => BP
                                                    [Amount] => KRW28000
                                                    [Key] => XBlzbPBAAA/BtnZ5UAAAAAAA
                                                )

                                            [1] => Array
                                                (
                                                    [Category] => SW
                                                    [Amount] => KRW25000
                                                    [Key] => XBlzbPBAAA/BunZ5UAAAAAAA
                                                )

                                            [2] => Array
                                                (
                                                    [Category] => YQ
                                                    [Amount] => KRW30800
                                                    [Key] => XBlzbPBAAA/BvnZ5UAAAAAAA
                                                )

                                        )

                                )

                        )

                )

          
    CommentAdd your comment...

    2 answers

    1.  
      1
      0
      -1

      지금처럼 별도 설명 없이 array데이터만 쭉 나열하면 특별한 도움을 드리진 못합니다.

      일단 님이 원하시는 array를 객체로 변환하기 위해선

      각 array가 담고있는 값들에 대한 의미를 갖는 클래스를 하나씩 선언하여 그 안에 값을 담으면 됩니다.


      하지만 이렇게 단순히 array를 객체로 변환한다고 코드가 더 나아지진 않습니다.

      그리고 별다른 설계 없이 이렇게 array를 객체로 변환만 해서는 코드가 더 복잡해집니다.


      아래 제가 느낀 몇가지 장점을 소개해드릴테니 책이나 외부 사례들을 좀 더 찾아보면서 작은 개인 프로젝트부터 천천히 고민해보시는게 더 좋을것 같습니다.


      1. ide의 편의기능을 사용할 수 있다.

      요새 대부분의 ide는 클래스 내부 구조를 파악해 자동완성을 제공하고 코드 리팩토링시 객체가 사용하고 있는 위치를 검색해주는 등 다양한 편의기능을 잘 활용할수 있다.


      2. array는 각 변수가 갖고있는 성격을 나타내질 못한다.

      -- 예약정보 --
      (
      	[BookingCode] => Q
      	[BookingCount] => 2
      	[CabinClass] => Economy
      	[FareInfoRef] => JPV2BPfB0BKA4lTWAKAAAA==
      	[SegmentRef] => JPV2BPfB0BKA+iTWAKAAAA==
      )
      
      -- 가격정보 --
      (
      	[Category] => G3
      	[Amount] => KRW19200
      	[Key] => JPV2BPfB0BKA7lTWAKAAAAAA
      )


      ( 지금처럼 데이터만 쭉 나열한것은 제 3자가 봤을때 아무런 의미를 갖지 못합니다. 데이터가 가지는 성격을 좀 더 설명해주셨으면 답변을 받는데 좀 더 도움이 되지 않았을까 싶습니다. 

      제 나름대로 의미를 부여해서 2개의 array가 위와 같이 예약정보와 가격정보를 나타낸다고 가정해보겠습니다. )


      지금처럼 array에 들어있는 데이터를 쭉 나열했을 경우에는 누군가 설명해주지 않으면 이 값이 무엇을 의미하는지 이해하기가 굉장히 힘듭니다.

      하지만 만약 예약정보는 BookingInformation 이란 클래스에 담기고, 가격정보는 Price란 클래스에 담겼었다면

      class BookingInformation {
      	private $bookingCode = 'Q';
      	private $bookingCount = 2;
      	private $cabinClass = 'Economy';
      	...
      }
      
      
      class Price
      (
      	private $category = 'G3';
      	private $amount = 'KRW19200';
          private $key = 'JPV2BPfB0BKA7lTWAKAAAAAA';
      )

      이처럼 아 이 값들이 무엇을 의미하고 있구나라는 것을 어느정도 이해할 수 있습니다.


      또한 함수에서 파라메터를 받을 때 타입을 한정지을수가 있습니다.

      function reserve($user, $flight) {
      }

      이 코드는 $user에 $flight 정보가 오거나, 뜬금없이 가격정보와 같은 데이터가 들어와도 오류를 발생시키지 않습니다.


      function reserve(User $user, Flight $flight) {
      	...
      }

      이 코드는 User객체와 Flight객체를 명시적으로 받아 다른 데이터가 들어오면 오류를 발생시킵니다.

      객체지향적으로 만들면 대부분의 개발 실수는 여기서 걸러집니다.


      1. naya

        친절한 답변 감사드립니다.

        질문시 더 자세하게 질문드려야 했었는데 죄송합니다.

        절차지향에서 객체지향으로 넘어가려고 하는데 너무 어렵네요.

        혹시 추천하시는 책 있으시면 부탁드립니다.

      2. 레시피

        클린코드 한번 읽어보세요 

        http://jhrogue.blogspot.com/2013/12/blog-post_16.html

        유투브강의도 있어요

      CommentAdd your comment...
    2.  
      1
      0
      -1

      레시피님이 잘 설명해주신것 같습니다. Collection과 Composite 패턴도 같이 보시면 좋겠어요.

        CommentAdd your comment...