Giải quyết các vấn đề code với PEDAC

26 tháng 02, 2020 – 419 lượt xemBài viết này phác thảo cách xử lý những yếu tố lập trình bằng cách sử dụng quá trình Launch PEDAC của Launch School. Có nhiều cách để xử lý yếu tố code, và PEDAC chỉ là một. Mục đích của bài viết này không phải là để công bố PEDAC là cách tiếp cận tốt nhất hoặc duy nhất mà là nhằm mục đích phân phối nó như một trong những công cụ bạn hoàn toàn có thể chuyển sang khi bạn khởi đầu thao tác với một yếu tố. Bạn hoàn toàn có thể không cần PEDAC trong mọi yếu tố, nhưng bạn sẽ tìm thấy rất nhiều lợi thế để sử dụng 1 số ít mạng lưới hệ thống khi thao tác với những yếu tố phức tạp hơn. Vấn đề code càng phức tạp, bạn càng cần một quá trình khắt khe như PEDAC. Cách tiếp cận này đặc biệt quan trọng có ích cho người mới mở màn học viết code do tại nhiều người mới mở màn chưa khi nào bị buộc phải sử dụng một mạng lưới hệ thống tư duy trước đây .

PEDAC là gì?

PEDAC là viết tắt của Problem, Examples / Test cases, Data Structure, Algorithm, và Code :

  • Problem là vấn đề cần giải quyết
  • Examples là các ví dụ
  • Test Cases là các trường hợp kiểm thử
  • Data Structure là cấu trúc dữ liệu
  • Algorithm là giải thuật
  • Và cuối cùng là code

PEDAC có 2 mục tiêu chính đó là process the problem (PEDA) – xử lý vấn đề và code with intent (C) – code với mục tiêu. Xem bảng dưới đây để biết thêm chi tiết:

Mục tiêuBướcMô tảXử lý yếu tốHiểu yếu tố

  • Xác định input và output mong muốn
  • Làm rõ các yêu cầu
  • Xác định các quy tắc
  • Mô hình tư duy (tùy chọn)

Các ví dụ / trường hợp kiểm thửXác thực sự hiểu biết về yếu tốCấu trúc tài liệuCách tất cả chúng ta biểu lộ tài liệu mà tất cả chúng ta sẽ thao tác khi quy đổi input thành outputGiải thuậtCác bước để quy đổi input thành outputCode với tiềm năngCodeThực hiện tiến hành giải thuật bằng code .Xử lý yếu tố gồm có 4 bước dẫn bạn từ xác lập yếu tố bắt đầu đến sự hiểu biết vững chãi về những gì được nhu yếu. Kết quả là thuật toán ( Algorithm ) mà bạn sẽ sử dụng để thực thi giải pháp .Khi bạn đã hiểu yếu tố, chọn cấu trúc tài liệu tương thích và có thuật toán để tiếp cận yếu tố, tổng thể những gì bạn cần làm là quy đổi thuật toán thành ngôn từ lập trình mà bạn chọn. Chúng ta gọi đó là code with intent – code với tiềm năng, và hiệu quả sau cuối là triển khai xong việc xử lý yếu tố bằng code .

Tại sao sử dụng PEDAC?

Đối với các vấn đề về độ tinh vi nhất định, PEDAC tiết kiệm thời gian. Có vẻ như khó tin rằng một quy trình tốn nhiều công sức như PEDAC có thể tiết kiệm thời gian, nhưng đó chính xác là những gì nó làm khi vấn đề phức tạp. Điều đó không có nghĩa là code ngay thì luôn chậm hơn; trong thực tế, đối khi việc code ngay lại nhanh hơn với các vấn đề đơn giản. Tuy nhiên, vấn đề càng phức tạp, càng có nhiều khả năng code ngay lập tức sẽ dẫn đến cái mà chúng ta gọi là “hack and slash”, một thuật ngữ không hay được sử dụng để mô tả code được viết mà không có ý định hoặc ngữ cảnh. “Hack and slash” thường không đáp ứng được các yêu cầu, không xử lý được toàn vẹn vấn đề và tạo ra các chương trình khó hiểu, khó duy trì và mở rộng quy mô. Một cách tiếp cận có quy củ và kỉ luật, chẳng hạn như PEDAC, giúp bạn xác định và tránh những cạm bẫy mà bạn có thể gặp phải trong quá trình code. Một vài sai lầm phổ biến khi code mà không có mục tiêu xác định:

  • Bỏ sót các yêu cầu.
  • Không lường trước được các trường hợp sẽ xẩy ra
  • Code khó hiểu
  • Code khó bảo trì, nâng cấp

Ví dụ mẫu.

Hiểu cách thao tác của PEDAC trải qua một ví dụ .

Giả sử bạn có một số tự nhiên tùy ý (mục tiêu) và một bộ gồm một hoặc nhiều số tự nhiên bổ sung (các yếu tố). Viết chương trình tính tổng của tất cả các số từ 1 đến số mục tiêu cũng là bội số của một trong các yếu tố.

Chẳng hạn, nếu mục tiêu là 20 và các yếu tố là 3 và 5, điều đó cho chúng ta danh sách các bội số 3, 5, 6, 9, 10, 12, 15, 18. Tổng của các bội số này là 78.

Nếu không có yếu tố nào được đưa ra, hãy sử dụng 3 và 5 làm yếu tố mặc định

Hiểu vấn đề.

Thật mê hoặc khi nhảy vào REPL và gõ code thật nhanh. Phải chống lại sự cám dỗ này. Bước quan trọng tiên phong của PEDAC là ” tiêu hóa ” yếu tố để có được sự hiểu biết rất đầy đủ và tổng lực về những gì yếu tố cần giải quyết và xử lý. Đừng có hấp tấp vội vàng ! Đọc kỹ phần miêu tả yếu tố ; đừng bỏ lỡ bất kể cụ thể nào. Trong hầu hết những phần miêu tả, không có từ nào thừa cả, thế cho nên đừng đọc nó như đọc một bài báo hay tạp chí nào đó. Mỗi từ và mọi chi tiết cụ thể đều quan trọng. Bộ não của bạn có khuynh hướng lấp đầy những khoảng trống nếu bạn bỏ lỡ bất kể cụ thể nào, nhưng nó hoàn toàn có thể không thực thi đúng chuẩn, như được minh họa bằng cách sau :

Trước tiên, hãy xác lập input và output cho yếu tố của tất cả chúng ta. Đọc phần miêu tả nhu yếu, tất cả chúng ta hoàn toàn có thể thấy rằng tất cả chúng ta có 2 input và 1 output :

input:

  số mục tiêu

  tập hợp các yếu tố

output:

  tổng bội

Trừ khi bạn quen thuộc với miền vấn đề (problem domain), còn có một khái niệm ngầm ẩn tinh tế được giới thiệu: bội số.

Để làm cho những nhu yếu / điều kiện kèm theo trở nên rõ ràng, tất cả chúng ta phải hiểu những điều kiện kèm theo khi chúng vận dụng cho miền yếu tố. Những từ này không số lượng giới hạn trong những từ bạn không quen thuộc, nhưng cũng có những từ có nhiều nghĩa. Chẳng hạn, từ ” balance ” hoàn toàn có thể có nghĩa là những thứ khác nhau tùy thuộc vào việc tất cả chúng ta sử dụng nó trong toàn cảnh kế toán hay chuỗi đáp ứng .Quay trở lại với thuật ngữ bội số ( multiple ), người cho rằng đây là một thuật ngữ toán học của người Bỉ có nghĩa là một số ít hoàn toàn có thể được chia cho 1 số ít khác mà không có phần còn lại. ( Thông thường, bạn sẽ không muốn thừa nhận điều gì đó nếu bạn không quen thuộc với miền yếu tố nhưng sẽ khám phá trước. Ở đây, chúng tôi là người đưa ra yếu tố, thế cho nên chúng tôi sẽ xác nhận rằng định nghĩa giả định này là đúng mực. ) ví dụ trong đoạn thứ hai, tất cả chúng ta hoàn toàn có thể xác nhận điều này :

số mục tiêu:

20

bội số của 3 (multiple of 3):

3, 6, 9, 12, 15, 18 (tất cả không có phần dư khi chia cho 3)

bội số của 5 (multiple of 5):

5, 10, 15 (tất cả không có phần dư khi chia cho 5)

Những quy tắc ẩn

Mô tả yếu tố này cũng truyền tải một vài quy tắc mà tất cả chúng ta phải ghi nhớ :

  • Các bội số được tính tổng phải là duy nhất. Số 15 là bội số của cả 3 và 5, nhưng chúng ta chỉ thêm một lần khi tính tổng (3 + 5 + 6 + 9 + 10 + 12 + 15 + 18 = 78). Lưu ý rằng chúng ta học điều này ngầm từ ví dụ: yêu cầu duy nhất không được nêu rõ ràng.
  • Giá trị mục tiêu là giới hạn, nhưng nó không được coi là bội số. Trong ví dụ, mục tiêu, 20, không được bao gồm trong tổng số mặc dù nó LÀ bội số của 5. Tương tự với quy tắc đầu tiên, quy tắc này là ẩn.
  • Tất cả các số là số tự nhiên: chúng là tập hợp các số nguyên lớn hơn hoặc bằng 0 hoặc 1 (xem định nghĩa này từ mathworld.wolfram.com). Vì việc thêm 0 vào bất kỳ số nào không làm thay đổi nó, nên chúng ta không sử dụng định nghĩa nào. Để đơn giản, chúng ta sẽ giả sử rằng các số tự nhiên bắt đầu bằng 1.

Bây giờ tất cả chúng ta đã giải quyết và xử lý yếu tố và hoàn toàn có thể xác định liệu có bất kể điều gì cần làm rõ hay không .

Làm rõ các câu hỏi

  1. Các giá trị có thể cho số mục tiêu là gì? Số âm có được phép không? Bất kỳ số tự nhiên nào lớn hơn 0. Sẽ luôn có một giá trị mục tiêu
  2. Làm thế nào các yếu tố sẽ được cung cấp cho chương trình? Ví dụ như sử dụng một mảng.
  3. Điều gì xảy ra nếu chỉ 3 hoặc 5 được cung cấp như một yếu tố? Chương trình vẫn nên mặc định cho cả hai yếu tố 3 và 5? Không. Mặc định là 3 và 5 chỉ khi không có yếu tố nào được cung cấp.

Bây giờ, tất cả chúng ta đã hiểu biết thấu đáo yếu tố cần xử lý. Tuy nhiên, để cho rất đầy đủ, hãy triển khai một bước giải quyết và xử lý tùy chọn sau cuối là đưa ra một quy mô mang tính ý niệm ( mental Model ) miêu tả yếu tố cần xử lý .

Chúng ta có thể hình dung mô hình mang tính ý niệm như là một cái nhìn tóm tắt của chúng ta về toàn bộ vấn đề. Nói cách khác, nó là quan điểm của chúng ta về những gì vấn đề yêu cầu giải quyết. Hãy chắc chắn rằng ở đây chúng ta chưa cần quan tâm đến cách giải quyết vấn đề (thuật toán hay giải thuật).

Đây là một quy mô mang tính ý niệm đơn thuần cho yếu tố đặt ra ở trên :

Xác định danh sách tất cả các bội số của một tập hợp các yếu tố cho đến một giá trị đích, sau đó lọc danh sách các bội số thành các giá trị duy nhất. Cuối cùng, tính toán và trả về tổng của bội số duy nhất.

Một quy mô khác :

Xây dựng một danh sách các số là bội số của một tập hợp một hoặc nhiều yếu tố. Thêm bội số vào danh sách chỉ khi nó chưa có trong danh sách. Cuối cùng, tính toán và trả về tổng của các số trong danh sách.

Lưu ý rằng chúng tôi đã đưa ra hai quy mô mang tính ý niệm trong ví dụ này. Chúng tôi đã làm điều này để làm điển hình nổi bật rằng có nhiều quan điểm để tạo ra một quy mô hài hòa và hợp lý ; như một quy tắc chung, bạn không cần phải đưa ra nhiều quy mô miễn là nó chớp lấy được không thiếu và đúng mực những nhu yếu .

Ví dụ / Các trường hợp kiểm thử.

Từ đầu đến giờ, tất cả chúng ta đã làm được rất nhiều việc, nhưng đó chỉ là bước tiên phong – PED trong PEDAC. Bây giờ tất cả chúng ta đã chuẩn bị sẵn sàng để chuyển sang bước E, viết tắt của những ví dụ hoặc những trường hợp thử nghiệm. Trong bước này, tiềm năng của tất cả chúng ta là đưa ra những ví dụ xác nhận sự hiểu biết của tất cả chúng ta về yếu tố và xác nhận rằng tất cả chúng ta đang thao tác đúng hướng. Xác nhận thường sẽ đến từ một người hoặc tài liệu của một quá trình : tất cả chúng ta hoàn toàn có thể nhu yếu người đó xác nhận output được cung ứng với input tương ứng hoặc tất cả chúng ta hoàn toàn có thể theo dõi tiến trình để kiểm tra output được tạo ra bởi input .[ Lời người dịch ] Hãy tưởng tượng có người nhu yếu bạn làm máy tạo ra xúc xích. Bước xác nhận này chính là việc tất cả chúng ta hỏi người đó về việc đầu ra của máy là gì ( trường hợp này là xúc xích ) hoặc bạn đi xem xét một cái máy làm xúc xích đang hoạt động giải trí ( theo giõi quá trình ) để biết rằng với những nguyên vật liệu nguồn vào ( input ) thì cái máy cho loại sản phẩm đầu ra ( output ) là xúc xích .Quay trở lại với yếu tố được đưa ra trong ví dụ. Chúng ta sẽ thử đưa ra một vài trường hợp kiểm thử, xác lập output dự kiến với 1 số ít input nhất định .

Trường hợp 1:

  • Input
    • Số mục tiêu: 20
    • Các số yếu tố: [3, 5]
  • Output: 78

Trường hợp 2:

  • Input
    • Số mục tiêu: 20
    • Các số yếu tố: [3]
  • Output: 63

Trường hợp 3:

  • Input:
    • Số mục tiêu: 20
    • Các số yếu tố: [5]
  • Output: 30

Trường hợp 4:

  • Input:
    • Số mục tiêu: 20
    • Các số yếu tố: []
  • Output: 78

Trường hợp 5:

  • Input:
    • Số mục tiêu: 1
    • Các số yếu tố: []
  • Output: 0

Lưu ý tất cả chúng ta đã lấy ví dụ từ những quy tắc ẩn ở trên. Đó là nơi tuyệt vời để tìm kiếm những trường hợp kiểm thử .Ngoài những trường hợp kiểm thử dựa trên những quy tắc của tất cả chúng ta, cũng nên cung ứng những trường hợp kiểm thử giải quyết và xử lý bất kể trường hợp biên nào hoàn toàn có thể tìm thấy. Các trường hợp biên là những nguồn vào tại những biên của phần diễn đạt yếu tố hoàn toàn có thể bị giải quyết và xử lý sai nếu tất cả chúng ta không cẩn trọng. Chẳng hạn, những yếu tố tương quan đến việc lặp qua những số có trường hợp biên ở một hoặc cả hai đầu của khoanh vùng phạm vi. Nếu không cẩn trọng, bạn hoàn toàn có thể nhận được câu vấn đáp không đúng mực ở những biên này. Các trường hợp biên nổi bật hoàn toàn có thể tương quan đến việc làm việc với những số âm, số 0 hoặc giá trị cực cao ( nếu hiệu suất là một nhu yếu ). Khi thao tác với những tập hợp, một ý tưởng sáng tạo tốt là tìm những trường hợp thử nghiệm giải quyết và xử lý bằng 0, một hoặc nhiều thành phần trong tập hợp .Với ví dụ này, có một trường hợp biên đáng kể : điều gì xảy ra ở số ở đầu cuối trước khi số mục tiêu là bội của một hoặc nhiều số yêu tốTrong mỗi trường hợp thử nghiệm của tất cả chúng ta ở trên, số sau cuối được thêm vào tổng là 18 hoặc 15. Điều đó khiến 19 ( giá trị ở đầu cuối được kiểm tra ) không nằm trong tổng, đó là điều đúng đắn. Tuy nhiên, giả sử rằng 19 sẽ được gồm có trong tổng, mà nếu 19 là một trong những yếu tố. Vì 19 là số lượng sau cuối hoàn toàn có thể kiểm tra ( đưa ra tiềm năng là 20 ), nên nó ở biên của khoanh vùng phạm vi giá trị được tính tổng. Để chắc như đinh, tất cả chúng ta gồm có 19 trong tổng số, tất cả chúng ta cần phân phối một trường hợp thử nghiệm giải quyết và xử lý nó .

Trường hợp 6:

  • Input:
    • Số mục tiêu: 20
    • Các số yếu tố: [19]
  • Output: 19

Cấu trúc dữ liệu

Bây giờ tất cả chúng ta đã sẵn sàng chuẩn bị để chuyển sang bước thứ ba trong chiêu thức PEDAC, đó là D. Với những trường hợp thử nghiệm của tất cả chúng ta đã đưa ra, điều tiếp theo cần làm là xác lập cấu trúc tài liệu nào sẽ được sử dụng để quy đổi input thành output. Các xem xét chính ở đây là ngôn từ lập trình dự tính và quy mô mang tính ý niệm của tất cả chúng ta .Sử dụng một trong những quy mô ý niệm, tất cả chúng ta thấy rằng cần tích lũy những giá trị là bội số của những số yếu tố. Một mảng có vẻ như như tương thích với bộ sưu tập bội số này. Sự độc lạ duy nhất giữa những quy mô của tất cả chúng ta nằm ở phương pháp và thời gian tất cả chúng ta lọc những số đó, nhưng tất cả chúng ta sẽ lo ngại về điều đó sau .Một điều cần quan tâm là Cấu trúc tài liệu sẽ tác động ảnh hưởng đến thuật toán của bạn. Vì vậy, tất cả chúng ta thường thấy ” Data structure ” – Cấu trúc tài liệu đi kèm với ” Algorithm ” – Giải thuật

Giải thuật

Trong bước này, nếu bạn đã có một mô hình ý niệm trong đầu, bạn có thể bắt đầu từ đó. Mặt khác, nếu chưa có, hãy bắt đầu với bước "Cấu trúc dữ liệu" và nghĩ về cách bạn xây dựng và thao tác để có được output tương ứng. Chẳng hạn, nếu đó là một mảng, có lẽ bạn sẽ tập trung vào việc xây dựng hoặc lặp lại qua một tập hợp.

Mục tiêu chính của tất cả chúng ta ở đây là xác lập một loạt những hướng dẫn sẽ quy đổi input thành output mong ước. Thách thức là để có được mức độ chi tiết cụ thể tương thích ; tất cả chúng ta cần một cái gì đó hoàn toàn có thể thuận tiện quy đổi thành code mà không cần thực sự phải viết code ngay. ( Tức là ở đây tất cả chúng ta cần gì đó để diễn đạt nên thuật toán một cách rõ ràng, từ đó hoàn toàn có thể quy đổi thành code của bất kể ngôn từ lập trình nào tương thích – Lời người dịch )Lý do bạn không muốn ( và cũng không nên ) miêu tả giải thuật bằng cách sử dụng một ngôn từ lập trình nào đó là vì điều đó sẽ làm mất đi tính linh động trong quy trình thực thi. Ngôn ngữ lập trình thường phân phối một số ít cách để đạt được một tác dụng nhất định, nhưng mỗi cách tiếp cận đó hoàn toàn có thể ảnh hưởng tác động đến những phần khác của chương trình. Nếu bạn đưa ra lựa chọn tiến hành quá sớm bằng cách dùng một ngôn từ lập trình đơn cử ( ví dụ Java ) để miêu tả giải thuật, rồi sau đó bạn phát hiện ra nên chọn một thứ khác, bạn hoàn toàn có thể cần quay lại và sửa đổi cả code và giải thuật. Nếu bạn không xử lý những biến hóa ở cả hai Lever, bạn hoàn toàn có thể gặp phải những cạm bẫy mà tất cả chúng ta đã bàn luận trước đó .Điều đó cho thấy, không có gì lạ nếu đổi khác thuật toán khi mở màn code cả ; đừng cảm thấy bị gò bó với những gì bạn đã viết khởi đầu. Trên thực tiễn, hai hay nhiều cá thể thao tác với cùng một yếu tố thường sẽ đưa ra những giải thuật khác nhau, đặc biệt quan trọng nếu mỗi cá thể đã kiến thiết xây dựng những quy mô ý niệm khác nhau. Để chứng minh điều này, đây là những thuật toán sử dụng cả hai quy mô ý niệm từ ví dụ của tất cả chúng ta :

Mô hình ý niệm thứ nhất:

Xác định danh sách tất cả các bội số của một tập hợp các yếu tố cho đến một giá trị đích, sau đó lọc danh sách các bội số thành các giá trị duy nhất. Cuối cùng, tính toán và trả về tổng của bội số duy nhất.

  1. Khởi tạo một mảng rỗng, đặt tên là multiples để lưu các số yếu tố.
  2. Kiểm tra xem danh sách các số yếu tố có rỗng không, nếu rỗng, hãy đặt danh sách thành [3, 5]
  3. Với mỗi số yếu tố trong danh sách số yếu tố:
    1. Đặt current_multiple thành hệ số để theo dõi bội số của số yếu tố.
    2. Khi current_multiple còn nhỏ hơn số yếu tố thì:
      1. Kiểm tra xem current_multiple đã nằm trong mảng multiple hay chưa?
        1. Nếu có thì không làm gì cả
        2. Nếu chưa thì thêm current_multiple vào mảng multiples
  4. Tính và trả về tổng của các số trong mảng multiples

Trước khi thực thi giải thuật của bạn, bạn nên kiểm tra thủ công bằng tay với những trường hợp thử nghiệm của mình. Bạn không cần phải kiểm tra toàn bộ những trường hợp thử nghiệm, chỉ đủ để tự tin rằng thuật toán hoạt động giải trí .

Trường hợp 1:

  • Input
    • Số mục tiêu: 20
    • Các số yếu tố: [3, 5]
  • Output: 78

-----------------------------------------------------------------------------

Giải thuật

  1. Tạo một mảng trống được gọi là multiple sẽ chứa danh sách bội số   multiple = []
  2. Kiểm tra xem danh sách các số yếu tố có trống không. Nếu không có sô yếu tố nào, hãy đặt danh sách thành [3, 5]                                 [3, 5] thu được từ các số yếu tố được cung cấp. 
  3. Với mỗi số yếu tố trong danh sách: [3, 5]
    1. Đặt current_multiple thành hệ số để theo giõi bội số của các số yếu tố
      1. current_multiple = 3
        current_multiple = 5
    2. Khi current_multiple < hệ số
      1. Thêm current_multiple vào mảng multiples
        1. multiples = [3]
          multiples = [3, 6]
          multiples = [3, 6, 9]
          ...
          multiples = [3, 6, 9, 12, 15, 18, 5, 10, 15]
      2. Gán hệ số vào = current_multiple
        1. current_multiple = 6
          current_multiple = 9
           ...
          current_multiple = 18
          current_multiple = 21
          current_multiple = 5
          current_multiple = 10
          current_multiple = 15
          current_multiple = 20
  4. Lọc các số trùng lặp trong mảng multiples
    1. multiples = [3, 6, 9, 12, 15, 18, 5, 10]
  5. Tính và trả về tổng của các giá trị trong mảng multiples

       78

Sau khi xác định rằng một vài trường hợp thử nghiệm của tất cả chúng ta phân phối output đúng như dự kiến, đã đến lúc tiến hành giải thuật bằng code .

Code nào!!!

Đây là bước sau cuối trong PEDAC - C, viết tắt của " code with intent ". Giai đoạn này là toàn bộ về việc thực thi những giải pháp trong ngôn từ của bạn lựa chọn. Lợi ích chính của việc góp vốn đầu tư thời hạn vào những bước trước ( PEDA ) là nó đơn giản hóa việc quy đổi thuật toán sang cú pháp của một ngôn từ lập trình .Đừng sợ nếu sau khi triển khai toàn bộ những bước trên, bạn vẫn phải quay lại với giải thuật của mình. Điều này hoàn toàn có thể và sẽ xảy ra liên tục. Dù sao thì, bạn là con người, và bạn hoàn toàn có thể đã bỏ lỡ điều gì đó. Tuy nhiên, PEDAC nhằm mục đích mục tiêu giảm thiểu những sai lầm đáng tiếc đó, vì thế bạn không bỏ lỡ những nhu yếu chính và ngay cả khi bạn quay trở lại những bước trước đó, nó hầu hết là để kiểm soát và điều chỉnh cách tiếp cận .Ở đây, tôi tiến hành giải thuật trên bằng Ruby theo quy mô mang tính ý niệm tiên phong :

def sum_of_multiples(target, factors)
  multiples = []
  factors = [3, 5] if factors.length == 0

  factors.each do |factor|
    current_multiple = factor

    while current_multiple < target
      multiples << current_multiple
      current_multiple += factor
    end
  end

  multiples.uniq.inject(0, :+)
end

sum_of_multiples(20, [3, 5])  # returns 78
sum_of_multiples(20, [3])     # returns 63
sum_of_multiples(20, [5])     # returns 30
sum_of_multiples(20, [])      # returns 78
sum_of_multiples(1, [])       # returns 0
sum_of_multiples(20, [19])    # returns 19

Tiếp đó, đây là code JavaScript sử dụng giải thuật phong cách thiết kế cho quy mô ý niệm thứ 2 đã thiết kế xây dựng ở trên :

function sumOfMultiples(targetNumber, factors) {
  var multiples = [];
  if (factors.length === 0) {
    factors = [3, 5];
  }

  factors.forEach(function(factor) {
    var currentMultiple;
    for (currentMultiple = factor; currentMultiple < targetNumber; currentMultiple += factor) {
      if (multiples.indexOf(currentMultiple) === -1) {
        multiples.push(currentMultiple);
      }
    }
  });

  return multiples.reduce(function(sum, value) {
    return sum + value;
  }, 0);
}

sumOfMultiples(20, [3, 5]);  // returns 78
sumOfMultiples(20, [3]);     // returns 63
sumOfMultiples(20, [5]);     // returns 30
sumOfMultiples(20, []);      // returns 78
sumOfMultiples(1, []);       // returns 0
sumOfMultiples(20, [19]);    // returns 19

Ruby hoặc JavaScript sẽ hoạt động giải trí cho cả hai quy mô ở trên. Tuy nhiên, quy mô tiên phong tương thích hơn với Ruby vì Ruby có phương pháp trả về những giá trị duy nhất trong một mảng ; JavaScript thì không .Thêm một chút ít. Code của người dịch bài, sử dụng Java :

public static int sumOfMultiples(int target, int[] factors){
        Set hashsetMultiples = new HashSet<>();

        for (int number: factors) {
            for (int i = 1; i < target ; i++) {
                if(i % number == 0){
                    hashsetMultiples.add(i);
                }
            }
        }

        int total = 0;
        for (int item: hashsetMultiples) {
            total += (int)item;
        }
        return total;
    }

Tổng kết

Chúng tôi hy vọng bài viết miêu tả tiến trình PEDAC này đã đưa ra cho những bạn thêm những gợi ý mới. Mặc dù có vẻ như dài dòng để để bao trùm thoáng rộng và diễn đạt những bước, nhưng mức độ chi tiết cụ thể này luôn là thiết yếu cho mọi yếu tố. Bạn cũng không cần phải sử dụng PEDAC. Ý tưởng chính nêu lên ở đây là để giúp bạn đưa ra được một giải thuật, sau đó code theo một cách có tiềm năng. Ban đầu, có vẻ như bạn sẽ phải làm rất nhiều việc, nhưng một khi bạn đã quen với việc sử dụng nó, bạn sẽ kinh ngạc khi thấy PEDAC nhanh và hiệu suất cao trong việc tương hỗ năng lực xử lý yếu tố của bạn đấy !

 

FAQ - Những câu hỏi thường gặp

  1. Những vấn đề nào tôi có thể giải quyết bằng PEDAC? PEDAC không thích hợp cho nhiều hoạt động trừu tượng như thiết kế giao diện người dùng. Nó hoạt động tốt với các vấn đề code có thủ tục vì nó dẫn bạn đến một loạt các bước / hướng dẫn mà bạn có thể làm theo để tạo ra kết quả xác định.
  2. Khi nào tôi nên sử dụng PEDAC? Tôi có nên sử dụng nó ngay cả khi vấn đề nhỏ? Nếu bạn không có kinh nghiệm trước khi sử dụng quy trình giải quyết vấn đề chính thức thì, vâng, hãy sử dụng nó cho các vấn đề tầm thường. Làm cho tâm trí của bạn được sử dụng để giải quyết vấn đề bằng cách làm theo PEDAC. Khi bạn đã quen với nó, nó sẽ trở thành một phần bộ não của bạn, và bạn sẽ có thể triển khai nó một cách tự nhiên hơn trong các vấn đề khó khăn hơn, đó là nơi bạn sẽ thực sự cần nó. Nếu lần tiếp xúc đầu tiên với PEDAC của bạn gặp phải những vấn đề khó khăn nhất, thì nó sẽ khó có thể sử dụng tốt quy trình này.
  3. Tôi có thể sử dụng PEDAC để phát triển ứng dụng và không chỉ giải quyết vấn đề mã hóa không? Có, nhưng bạn sẽ có một số công việc cần làm trước khi sử dụng nó. Để sử dụng PEDAC hiệu quả, hãy chia nhỏ ứng dụng thành các yêu cầu nhỏ hơn. Bạn có thể phải so sánh với các vấn đề code trước đây mà bạn đã giải quyết nếu nó có kích thước nhỏ phù hợp với PEDAC. PEDAC có thể được áp dụng cho bất kỳ vấn đề nào có input cụ thể và output rõ ràng, do đó, bạn sẽ phải chia nhỏ ứng dụng của mình cho đến khi bạn có các yêu cầu cụ thể và rõ ràng.

Dịch từ bài viết Solving Coding Problems With PEDAC

Source: https://expgg.vn
Category: Thông tin

Total
0
Shares
Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Previous Post

5 kinh nghiệm đi rừng trong Liên Quân người chơi cần phải biết

Next Post

LMHT: Muốn trở thành một Xạ Thủ giỏi, bạn hãy nhớ kỹ và làm theo 50 lời khuyên này (Phần 2)

Related Posts