Software Engineering (phần 13) ppt

20 326 0
Software Engineering (phần 13) ppt

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

j '1 so. t p v . . ,. . Moin,enonee psose : ' ; f . ' funetion open-disk-file funetion open-tape-file function open-diskette-file . (a) . I I . Fileclass ) ( abstract method open I . ! ' l I 1 . I DiskFileclass TapeFileclass DisketteFileclaes Im plem entation of Imptementation of lmplementation of ' method open method open method open h tbr a disk file fof a tape file for a diskette file : (b) Flgure I#.a Definiiion of base class Filecloss with derived class DîskFileclcss, TopeFilecbss, . and Diske- Filecloss. . A derived class now is defined, that is, a class identical to the base class in many ' but new features may be added and existing features renamed , reimplemented,. ways, suppressed, or changed in other ways. Furthermore, these changes may be made j without having an effect on the base class or any other derived classes. However, ) suppose now that the base class itself is changed. lf this happens, all derived classes 1 are changed in the same way. In other words, the strength of inheritance is that new , leaves can be added to the inheritance tree (or graph, if the implementation language l supoorts multiole inheritance, as C++ does) without alterinz anv other class in the ! * * '' %-''' .'' . j tree. But. if an interior node of the tree is changed in any way, then this change is . propagated to al1 its descendants (the iifragile class problem''). Thus, inheritance is ! another feature of object-oriented technology that can have a major positive in:uence1 on development but a negative impact on maintenance.l . ! J ' ) ' 1*.* AINTKNANCK $KItk9 VERSUS p :v:kopM :NT SKILLS Earlier in this chapter m uch was said about the skills needed for maintenance. Fof l i intenance , the ability to determinethe cause of afailure of alarge product '! Correot ve ma i was deemedessential. But this skill is notneeded exclusively forproduct m aintenance .! 1 l . ) ' I Please purchase Image To PDF Converter on http://www.verypdf.com/ to remove this message, thank you. - ' k ' '!j, ' ,I .h ' ' l 1 i11 l l ' . Il.y REVERSE ENGINEERING sos I jl i ' t ' I .l j I: lt i s used throughout integration and product testing. Another vital skill is the ability 1, .I . to functilm effectively without adequate documentation. Again, the documentation jl ' rarely is complete while integration and product testing are under way. Also stressed jlj: '1 jkill s w ith regard to specihcation, design, implementation and integration, 1I' '(was that s jj j' . j!' I and testing are essential for adaptive and perfective maintenanee. These activities also ij (1) ' i d t during the development process, and each requires specialized skills 'I' lare carr e ou . k' j : ) .). . if it is to be performed correctly. ) j j' ln other words, the skills a maintenance programmer needs are diftkrent in no way I1; 'j i jl from those needed by software professionals specializing in other phases of software l '; 1production . The key point is that a maintenance program m er m ust not be merely skilled in a broad variety of areas but highly skilled in 6111 those areas. Although the jr ' tware developer can specialize in one area of software development, such E1 )average sof I r '1 as design or testing, the software maintainer must be a specialist in virtually every 1 ' d tion. After all, maintenance is the same as development, only l jarea of software pro uc l J E-more SO . . 1 . :1 !1 1 : 1l ;J ! ij 1ê.T REVKRSE EN/INEERIN/ ; il7 .11 p . ' n EjAs has been pointed out , som etim es. the only documentation available tor m ainte- li . 1 1 nance is the source code itself. (This happens aIl too frequently when maintaining 2 !! h ' Iegacy' A' . v,s'/c/z?.ç, that is, software in current use but developed some l 5 or 20 years ago, i if not earlien) Under these circumstances, maintaining the code can be extremely dif- b hcult. One way of handling this problem is to start with the source code and attempt ' ! It to recreate the design documents or even the speeihcations . This proeess is called , ! reverse engineering. 7r ; Ei r CASE tools can assist with this proeess. One of the simplest is a pretty printer ' j! (Section 5.6), which may help display the code more clearly. Other tools construct l kl1 - ; -idi agrams, such as flowcharts or UML diagrams, directly trom the souree code'. these , j ji 1 . visual aids can help in the process of design recovery. ! j : Once the m aintenance team has reconstructed the design, there are two possibil- : 1 ; ! ) ' ities. One alternative is to attempt to reconstruct the specifications, modify the recon- ' ' '' ' '' ' -'' j ;structed specificatitm s to renect the necessary changes , and reimplement the product l ' l the usual way. (W ithin the context of reverse engineering, the usual development j j process that proceeds from specifications through design to code is called jbrward j i engineering. The process of reverse engineering followed by forward engineering j sometimes is called reengineering.) In practice, reconstruction of the specilications 1 1 , ' l the reconstructed design is modihed and 1is an extremely hard task . More trequent y, ljt 1 , the modilied design then is forward engineered. A related activity often pertbrmed during the maintenance phase is restructuring. Ij ' Reverse engineering takes the product from a lower level of abstraction to a higher ! 1 . x 1 level ot abstraction, tor example, from code to design. Forward engineering takes the I hlm a higher level of abstraction to a lower level. Restructuring. however, ' ).product f 1 ! ( . E l l Please purchase Image To PDF Converter on http://www.verypdf.com/ to remove this message, thank you. 5@* t H A p T E R 44 * M oinfenante Phase takes plaee at the same level. lt is the process of improving the product without changing its functionality. Pretty printing is one form of restructuring', so is converting ) code from unstructured to structured form. In general, restructuring is performed to t make the source code (or design or even the database) easier to maintain. ' A worse situation occurs if the source code is lost and the executable version of the product is all that is available. At first sight it m ight seem that the only possible ! l way to recreate the source code is to use a disassembler to create assembler code i j then build a tool (that might be termed a reverse compiler) to try to recreate the ' i inal high-level language code. A number of virtually insurmountable problems .Or g accompany this approach'. l . The nam es of the variables will have been lost as a consequence of the original com p 2. M any compilers optimize the code in some way, making it extremely difhcult to attempt to recreate the source code. 3. A construct such as a loop in the assembler could correspond to a number of different possible constructs in the source code. : ln practice, therefore, the existing product is treated as a black box and reverse engineering is used to deduce the specifications from the behavior of the current product. The reconstructed specihcations are modified as required, and a new version of the product is forward engineered from those specihcations. j ' ' ! l 1ê.@ TKSTIN/ PURIN/ THE AINTKNANZE PHM K l ' 1 W hile the product is being developed, many mem bers of the development team have ! ! a broad overview of the product as a whole, but as a result of the rapid personnel l turnover in the computer industrys it is unlikely that members of the maintenance team; ! 5 j during the maintenance phase will have been involved in the original development. j Therefore, the maintainer tends to see the product as a set of loosely related modules 1 and generally is not aware that a change to one module may seriously affect one or 1 more other modules and hence the product as a whole. Even if the maintainer wished l to understand every aspect of the product, the pressures to tix or to extend the product generally are such that no time is allowed for the detailed study needed to achieve this. Furthermore. in many cases, little or no documentation is available to assist in ' gaining that understanding. One way of trying to minimize this difficulty is to use , rexression testinc, that is. testing the changed product against previous test cases to ' ensure that it still works correctly. , For this reason, it is vital to store all test cases, together with their expected outcomes. in machine-readable tbrm. A s a result of changes made to the product, certain stored test cases may have to be modilied. For example, if salary withholding percentages change as a consequence of tax legislation, then the correct output from j l a payroll product for each test case involving withholding will change . Similarly, if 1 llite observations lead to correctitlns in the latitude and longitude of an island , thensate ! the correct output from a product that calculates the position ot an aircratt using the 1 Please purchase Image To PDF Converter on http://www.verypdf.com/ to remove this message, thank you. i li, ' @ k pl ? - i 1.1* . 1* METRICS FoR THE MAINTENANCE PHME 5@7 l ; ?' l ) ! . -1 ( . jcoordinates of that island will changecorrespondingly. Depending on the maintenance l!j' I performed, some valid test cases will become invalid. But the computations that need l 1. ' to be made to correct the stored test cases essentially are the same as would have to lj'l be made to set up new test data for checking that the maintenance has been correctly l i ; l . Iperformed . No additional work therefore is involved in maintaining the file of test iI. 11 d their expected outcomes. l /cases an i 1 ,1 lt can be argued that regression testing is a waste of time because regression l î y testing requires the complete product to be retested against a host of test cases, most ) 1 11lg of which apparently have nothing to do with the modules modihed in the course of l 11 1 :product m aintenance . The word apparently is critical in the previous sentence. The j . !d angers of unwitting side effects of maintenance (that is. the introduction of regression Jj Ii ' i ' , ' 2- * - * faults) are too great for that argument to hold water', regression testing is an essential l 1 : !1 aspect of maintenance in all situations. ' yl E ' ( il . j 4 .j ' 1 : j 1. 1) i ! Il : !1*.* ZASE Tooks FoR THE AINTKNANtE PHASK I ) ! l . ( J. lt is unreasonable to expect maintenance programmers to keep track manually of the r j : various revision numbers and assign the next revision number each time a module is r ) 11 updated. Unless the operating system incorporates version control, a version control j : tool such as the UNIX tools sccs (source code control system) (Rochkind, 19751, rcs i 1 ' i 1 ' (revision control system) (Tichy, l 9851, or cvs (concurrent versions system) (Loukides j and Oram, 1 9971 is needed. lt is equally unreasonable to expect manual control of (he 1lr-freezing technique described in Chapter 5 or any other manual way of ensuring that ! t. revisions are updated appropriately. A configuration control tool is needed. A typical . l 1example of a commercial tool is CCC (ehange and configuration control). Even if the j j software organization does not wish to purchase a complete conhguration control tool, . 1 at the very least. a btlild tool must be used in conjunction with a version control tool. ! i j. )A nother category of CASE tools virtually essential during the maintenance phase is j j jll a fault tracking tool that keeps a record of reported faults not yet lixed. ( ! (l'. lSection l 6 . 7 described some categories of CASE tools that can assist in reverse ! Ij engineering and reengineering. Examples of such tools that assist by creating visual 1 )di splays of the structure of the product include Battlemap, Teamwork, and Bachman :1 j . lR eengineering Product Set. Maintenance is difhcult and t-rustrating. The very least that management can do is to provide the maintenance team with the tools needed for efficient and effeetive r duct maintenance. 1' J.prO ' k 1' j ' . 1l : 41* .1* KTRItS F@R TH: AINTKNANtE PHASE ë I ' l î )The activities of the maintenance phase essentially are specification , design. im- j ' j i plementation, integration, testing, and docum entation. Therefore, the metrics that j j ! 1 l - 1 Please purchase Image To PDF Converter on http://www.verypdf.com/ to remove this message, thank you. soe t u A p T : R 11 * Moindenante Phose ' measure these activities are equally applicable to the m aintenance phase. For exam- ple, the complexity metrics of Section 14.8.2 are relevant to maintenance, in that a module with high complexity is a likely candidate for inducing a regression fault. Particular care must be taken in modifying such a module. ' In addition, metrics specific to the maintenance phase include m easures relating to software fault reports, such as the total number of faults reported and classihcations of those faults by severity and type. ln addition. information regarding the current status of the fault reports is needed. For exam ple. there is a considerable difference between having 13 critical faults reported and fixed during 2002 and having only 2 critical faults reported during that year with neither of them fixed. 1*.11 A IR G OURM KT QASE STUPY: AINTENANtK PHASE 1 ' A num ber of faults have been seeded in the source code of the case study. 1 ' Detecting and correcting three of them is left as an exercise (Problems 16.1 1 ' . through l 6. 1 3). $. i l*aQ ZHALLEN/ES @F THE AINTENANQK PHASE ( . A major challenge of the maintenance phase is explained in detail in the Just in Case You W anted to Know box on page 1 0. In briefp classical software engineer- ing can be described as debtelolllnellt-tllell-mal'ntellance. That is. lirst the product is developed from scratch and delivered to the client. From then on it is maintained. This development-then-maintenance m odel is consistent with the detinitions of IEEE Standard 610. 1 2: A11 software production activities carried out before the software is delivered to the client are considered to be development. and a1l activities after delivery constitute maintenance IIEEE 610. l 2. 19901. The developm ent-then-m aintenance model is unrealistic today: l . The client's requirements frequently change before the product is delivered. ' ; 2. Faults often have to be hxed before the product is delivered. 3. Development from scratch is becoming increasingly rare. Instead, much of the ( ' product is built out of reused components, and these reused com ponents fre- ' quently need to be m odilied before they can be utilized in the new product. For these three reasons. a product almost always has to be modified before de- Iivery, and the activities performed when carrying out those modihcations are indis- 11 tinguishable from those of classical maintenance. 1 The realities of maintenance are captured in ISO/IEC Standard 12207. which i states that the maintenance process is activated when ç'software undergoes modi- Please purchase Image To PDF Converter on http://www.verypdf.com/ to remove this message, thank you. j ' I ' j ' FoR FURTHER READING 5@@ 1 : l . 1 : Ih cations to code and associated documentation due to a problem or the need for j'y i '' Iso/lEc 12207 19951. 1. 'improvement or adaptat on g , : . 1l I ook forward to the day when a greater proportion ot the sottware engineering j ' it accepts that S:maintenance'' is an activity performed throughout the soft- l 1commun y l 11ware life cycle . This will Iead to major improvements, not just to the maintenance , j1 hase, but to the entire software development process. I iIP I 1 11 l 11l I ;1I I ! j i l 1 i ' I tHAPTKR Rzvlzw 1E i ' . I @ : kM aintenance is an important and challenging software activity (Sections 16.1 and t j 16 2). This is illustrated by means of the case study of Section l 6.3. Issues relating to 1, il . * t jj ' i tenance are described (Section 16.4), including the problem ' 11the management ot ma n l 11 of repeated maintenance (Section 16.4.4). The maintenance of object-oriented soft- !1y .1ware is discussed in Section l 6 .5. The skills that a m aintenance programm er needs j : are the same as those of a developer', the difference is that a developer can specialize )l in One asllect Of the software process, whereas the maintainer must be an expert in all ( Ij aspects of software production (Section 16.6). A description of reverse engineering 1 ' 11is given in Section l 6 . 7. Next follows a description of testing during the maintenance j g phase (Section 16.8) and CASE tools for maintenance (Section 16.9). Metrics for the ! 11 : 11 maintenance phase are discussed in Section 1 6. 1 0. M aintenance of the Air Gourm et case study, cited in Section l 6. l 1 , is Ieft as an exercise. The chapter concludes with a discussion of the challenges of the maintenance phase (Section l6. 12). I : I . l FoR FURTHER R EAPIN/ L11 11 Aclassic source of information on maintenance is (Lientz and Swanson, 19801. Useful 21 1 material on maintenance can be found in (Longstreet, 19901. gBasili, 19901 presents jj jjI ;!an interesting view of m aintenance as a reuse process . Regression testing is analyzed j;r !) I ' :in (Rothermel and Harrold, 19961., predicting its cost effectiveness is described in i (Rosenblum and Weyuker. 19971. Regression testing in an industrial environment is iscussed in (Onoma, Tsai, Poonawala, and Suganuma, 19981. Planning of reengi- 2d neering is covered in (Sneed, l 9951, one of the many articles on reengineering in j the January 1995 issue of IEEE Software. Costs and benefits of reengineering are i discussed in (Adolph, 19961. (Charette. Adams, and White, 19971 describe risk man- j agement within the framework of maintenance. And (von Mayrhauser and Vana, i 1 ' 1. 19971 describe various mechanisms of program comprehension for maintenance . I of large-scale products. A profile of successful reengineering projects is given in ' (Teng. Jeong, and Grover, 19981. M aintenance of information systems is described in (Bisbal, Lawless, Wu, and Grimson, 19991. The use ot metrics within the context ot 1 ! maintainability is discussed in (Banker, Datar, Kemerer. and Zwieg, l 993, and Henry, 1 qH enry, Kafura. and Matheson, l 9941. ;1 1 j ' ' I . Please purchase Image To PDF Converter on http://www.verypdf.com/ to remove this message, thank you. 51@ t u A p T : R 14 @ M oinfenonie Phase The impact on maintenance of the use of objects is described in gl-lenry and 16.1 Humphrey, 1 990, and Mancl and Havanas. 1 9901. Maintenance of speciéc object- oriented products is described in (Lejter. Meyers, and Reiss, l 992, and Wilde, j;.j Matthews, and Huitt, l 9931. Papers on software maintenance appear in the M ay l 994 issue of Communications q/' the ACM. The July/August 1 998 issue of IEEE Stftware contains a number of (' articles on legacy systems, especially gRugaber and White, l 9981. The proceedings jw .jl f the annual Conference on Software M aintenance are a broadly based source of. o int-ormation on aIl aspects of m aintenance. 1f.1 !;.j 1d.1 PRO BU M S i 16.1 W hy do you think that the mistake is frequently nlade of considering software main- tenance to be inferior to software development? 16.2 Consider a product that determines whether a computer is virus free . Describe why ( such a product is Iikely to have multiple variations of many of its modules . W hat are I the im plications for maintenance? How can the resulting problems be solved? . g ' ' ' . 16.3 Repeat Problem l 6.2 for the automated library circulation system of Problem 8.7 . ' : j 16.4 Repeat Problem l 6.2 for the product of Problem 8.8 that checks whether a bank ' . statem ent is correct. : 16.5 Repeat Problem 16 .2 for the automated teller machine of Problem 8.9. i 1ô 6 You are the manager in charge of maintenance in a Iarge software organization . Whatj @ il qualities do you Iook for when hiring new employees? ' j; l 1 6.7 w hat are the implications of maintenance for a one-person software production or- :1 ization? ! gan 1 8 You have bee n asked to build a computerized fault report file. W hat sort of data would'i 1*. I you store in the file? W hat sort of queries could be answered by your tool'? W hat sort 1 of queries could not be an swered by ytlur tool? 1f.9 You receive a memo from the vice-president for software maintenance of Ye Olde ; Fashioned Software Corporation (Pr()bIem 15.6) pointing out that, for the foreseeable futures Olde Fashioned will have to maintain tens of millions oflines of COBOL code and asking your advice with regard to CASE tools for such maintenance . W hat do , you reply? 16.10 (Term Project) The free accommodation and transportation provided by the Joining ' Children with their Fam ilies subcommittee of Broadlands Area Children's Hospital (Appendix A) currently is restricted to children whose parents live within a 500-mi1eI j radius of Broadlands. Now this restriction is to be lifted. What changes need to be i made to your product of Problem 15 . 10? Compare your answer to the answer youi I gave to Problem I . l l . J ' Please purchase Image To PDF Converter on http://www.verypdf.com/ to remove this message, thank you. . jjjj j . j Ij j-l . !ij j I I l' REFERENCES sII 11 1 : I l ' t I l . 1 1ô.1 1 (Case Study) Correct the implementation of Section l 5. l 3 so that once a seat has been '1 l assigned to a passenger it cannot subsequently be assigned to another passenger. . 1. ' 1é.1 2 (Case Study) There are 13 kinds ofspecial meals in the Air Gourmet case study: How- 1', lI !: ' ever, there are places in the implementation of Section l 5. l 3 where the program m er ! i ' ' - 'ij : : ' ë seems to have thought that there were only 12 kinds. Fix the implementation appro- i j .I g :jl priately. I ' ' j .11: .13 (Case Study) The implementation of Section 15.13 does not check that, when the user j ll ! inputs meal quality, the value is in the range 1 through 5. Fix this fault. l.I (J ! ; 2 16.14 (Case Study) lmprove the aesthetic appearance of a11 the reports in the implementation l 1 1' of section 15 . 13 by adjusting the alignment of the various components. j ! ,. ! 16.1 5 (Case Study) Replace the menu-driven input routines in the implementation of Section ' 1' '!l I ' :. 215 . l 3 with a graphical user interface. 11 '' i : 1&1f (Readings in Software Engineering) Your instructorwill distribute copies of (Rugaber : : and White, 19981. What do you see as the biggest challenges of maintaining legacy j j systems? I 1 I ël I ij l (1 ' ë i;1- l ' . 11! li ' jI j' : REFKRENtKS i . . 1 ' 7j I'CaSIA COW in the Tar Pit : Reengineering a Legacy System,'' ' 1. gAdolph, 1 9961 W. S. ADOLPH, , j ! IEEE Softbvare 13 (May l 996). pp. 4 1-47. : l! I ' (Banker, Dataq Kemerer, and Zwieg, 1 9931 R. D. BANKER, S. M . DATAR, C. F. KEMERER, ' I AND D. ZwIEG, ttsoftware Complexity and Maintenance Costs,'' Communications ofthe . 5 ACM 36 (November 1993), pp. 8 1-94. : 1 1 I(Basili , 19901 V. R. BASILI, t'Viewing Maintenance as Reuse-oriented Software j j Development,'' IEEE Software 7 (January l 990), pp. l 9-25. 'j (Bisbal, Lawless, Wu, and Grimsons 1 9991 J. BISBAL, D. LAwl-Ess, B. W IJ, J. GRIMSON, '! ttlwegacy lnformation Systems: lssues and Directionss'' IEEE Software 16 l 11' l g. (September/october l 999), pp. I 03-1 1 . 1 l 'j 1 itcharette , Adams, and White, 19971 R. N. CHARETTE, K. M . ADAMS. ANn M. B. W HITE. j ) ij ''Managing Risk in Software Maintenance,'' IEEE s'ofrwwrc 14 (May/lune 1 997), 1 l 1l l i pp. 43-50. 1 i. 1 gl-lenry and Humphrey, 19901 S. M. HENRV AND M. HUMPHREY, ''A Controlled Experiment : to Evaluate Maintainability of Object-oriented Software,'' Proceedings ofthe IEEE k ' ! i . Conference on sk//wtzrc Maintenance, San Diego, CA, November 1 990, pp. 258-65. j g gldenry, Henry, Kafura, and Matheson. 19941 J. HENRY, S. HENRY, D. KAFIJRA, AND ' L. MA'rHssoN, ''lmproving Software Maintenance at Martin Marietta,'' IEEE Softbvare I 94), pp. 67-75. 111 (JuIy 19 1 (IEEE 6 l0. 1 2, l 9901 ''A Glossary of Software Engineering Terminologys'' IEEE 610. 12- 1 990, 21i lnstitute of Electrical and Electronic Engineers, New York, 1990. 'j û. :IISO/IEC 1 2207: l 995, Information Technology software ' iJIISO/IEC l 2207, 1 9951 '' lnternational Organization for Standardization, International j' Life-cycle Processes, ! Electrotechnical Commission, Geneva, 1995. l lj ! ) (Lientz and Swanson, 19801 B. P. LIENTZ ANt) E. B. SwAxsopk, Software Maintenance I ' ilM anagement: zt Study ofthe Maintenance c/-tl-tpp/prdrcr Applications Softvvare in 487 i1 Data Processing Organizations. Addison-W esley, Reading, M A, l 980. ( ' . j' ! Please purchase Image To PDF Converter on http://www.verypdf.com/ to remove this message, thank you. j ' 1 l ! j ' 1 i A R R œ M o : x ( k ' ? ' 1 J A IR * @ URM ET QASE STUPT: : t pIp PR@T@ TTPE ! ' . j ' 1 The C rapid prototype for the Air Gourmet case study is available on the World Wide Web at 7 - .mhheacom/engcs/compsci/schach.! ' ' . ( - 1 1j ' , l ' i ; 5 Et ! . : : ' ! . l ! ) 1 ; : i . l ' : : . 520 Please purchase Image To PDF Converter on http://www.verypdf.com/ to remove this message, thank you. ' r j i ' i t ' p ' . . I j l w o o . - o : x ;1 l ) I - j ) ' j ; ; ! jA IR * @ URM KT QAS: sTupy r ; l Jav. pIp p Ro To a p: ' : 1. pi !. ! 1, l . j j j Yhe Java rapid prototype for the Air Gourmet case study is available on the W orld Wide Web at j 11 ) . - .mhhe.com/engcs/compsci/schach. , . 1 ;' l jI lj ' l i ! ? j . ! ! ; ! ' jj !1 r( ' l' ) j ' !I 2 l ' , , p l ( ' ' j j 1! !i - ! ' 521 f k j j ' Please purchase Image To PDF Converter on http://www.verypdf.com/ to remove this message, thank you. . restructuring, 505 Software Engineering lnstitute (SE1)s 51 -54 str ' retirement. l0. 43-44, l 60 software engineering resources, 51 8- I 9 stf reusable component, 2 1 2-l 5 software factory,. sta requirements phase, See requirements software crisis, 5 ste : requirements testingm 34-35 software development environment. See CASE resource software engineering tcs ; dehnition, 272 definition,. )l in One asllect Of the software process, whereas the maintainer must be an expert in all ( Ij aspects of software production (Section 16.6). A description of reverse engineering 1 ' 11is

Ngày đăng: 07/07/2014, 06:20

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan