Một số thực hành tốt khi cố gắng dạy lập trình khai báo cho các lập trình viên mệnh lệnh là gì?


13

Tôi đề nghị được đào tạo một chút về F # tại công ty của tôi và họ dường như thể hiện sự quan tâm. Họ thường là những lập trình viên VB6 và C #, những người không theo dõi lập trình với quá nhiều đam mê. Điều đó được nói rằng tôi cảm thấy dễ dàng hơn để viết mã chính xác khi bạn nghĩ trong một vấn đề chức năng vì vậy họ chắc chắn sẽ nhận được một số lợi ích từ nó.

Bất cứ ai có thể cung cấp một số lời khuyên về cách tôi nên tiếp cận điều này?

Ý tưởng

  • Đừng tập trung vào cú pháp, thay vào đó hãy tập trung vào cách ngôn ngữ này và các thành ngữ mà nó quảng bá có thể được sử dụng.
  • Hãy thử và nghĩ về các ví dụ là một nỗi đau để viết theo kiểu bắt buộc nhưng chuyển thành mã thanh lịch khi được viết theo kiểu khai báo.

F # và lập trình khai báo ?????
P Shved

@Pavel - Đó có phải là một câu hỏi?
ChaosPandion

3
@Pavel - OK, quan tâm giải thích lý do tại sao bạn đưa ra tuyên bố? Đây là lần thứ hai bạn đưa ra những bình luận cực kỳ mơ hồ. Nó rất thô lỗ.
ChaosPandion

3
vi.wikipedia.org/wiki/Declarative_programming Lập trình hàm một loại lập trình khai báo. Ngoài ra, +1, câu hỏi hay.
Lưu ý đến bản thân - nghĩ về một cái tên

2
@Chaos, theo tôi, F # không hỗ trợ mô hình lập trình khai báo. Đánh giá háo hức và các tính năng bắt buộc của nó làm cho ngôn ngữ chỉ là một hình thức thuận tiện, giống như chức năng biểu thị cùng một câu lệnh mệnh lệnh mà bạn sử dụng, giả sử, C #. Thôi nào, thậm chí còn makelà ngôn ngữ khai báo nhiều hơn F # hoặc Caml! (Trớ trêu thay, điều này làm cho công việc của bạn dễ dàng hơn.)
P Shved

Câu trả lời:


5

Lập trình chức năng là một con thú kỳ lạ đối với tôi. Tôi đã học F # và Haskell, đã viết một vài chương trình đơn giản và thích sử dụng chúng, nhưng không bao giờ có "ánh sáng mặc khải" mà một số người nói đến. Nhưng dần dần, tôi nhận thấy rằng càng ngày tôi càng viết mã có nghĩa là bất biến, chia nhỏ các nhiệm vụ thành nhiều chức năng nhỏ hơn và cố gắng sử dụng các đại biểu nhiều hơn nữa. Đó là một điều mà, nếu bạn thích nó, len lỏi vào công việc của bạn bởi vì giá trị của những kỹ thuật đó là hiển nhiên.

Bây giờ, thực tế hơn cho đào tạo: Tôi thấy rằng hai khái niệm thực sự nhấp vào Lập trình chức năng như một phong cách đối với tôi.

Đầu tiên, kiểu FP dựa trên cấu trúc dữ liệu, không phải thành phần như trong OOP. Tôi đã xem một cái gì đó như Danh sách trong C # là một mẹo thông minh để tạo danh sách an toàn loại, thứ gì đó bao gồm loại (chuỗi) vào loại (danh sách) khác. Sau khi học FP, tôi nhìn vào tướng giống như Monads bây giờ. Danh sách là một hình thức có cấu trúc mà mã có thể lấy và nó trang trí các chuỗi.

Thứ hai, và có lẽ hữu ích hơn cho các lập trình viên C # / ASP, là ý tưởng rằng FP hoạt động trên đệ quy và lặp lại, trong khi OOP hoạt động trên khả năng biến đổi và lặp. Bây giờ tôi có xu hướng nghĩ về vòng đời của trang ASP như một loại FP: mỗi yêu cầu được xử lý từ đầu trong toàn bộ vòng đời, do đó, toàn bộ trang thực sự là một chương trình đệ quy chậm. Nếu bạn có thể thu hẹp khái niệm đó xuống, bạn sẽ hiểu rõ hơn về cách một chương trình bắt buộc có thể được cấu trúc xung quanh các vòng lặp của các hàm lấy dữ liệu, vận hành trên nó và trả lại dữ liệu mới thay vì sửa đổi dữ liệu cũ.

Rào cản khó khăn nhất, ít nhất là đối với tôi, để vượt qua với phương pháp này là cảm giác chìm khi bạn lãng phí hàng tấn tài nguyên khi sử dụng các vật thể đột biến sẽ tiết kiệm được rất nhiều bộ nhớ. Trong GC chúng tôi tin tưởng, và tôi chỉ cần học cách loại bỏ các mối quan tâm về hiệu suất cho đến khi tôi thực sự thấy chương trình chạy và xác minh nếu có, và nếu vậy hãy sử dụng một trình lược tả để xem chính xác vấn đề ở đâu.



1

Nhiều ngôn ngữ lập trình mệnh lệnh (Ada, C / C ++, Turbo Pascal, FoxPro) có khả năng xác định con trỏ tới các hàm hoặc tên thủ tục có thể được đánh giá (và các thủ tục được đặt tên theo nghĩa đen được gọi) trong thời gian chạy.

Ví dụ truyền thống là qsort trong C. Xây dựng trên quan niệm rằng bạn có thể xác định các thuật toán thực thi các thuật toán khác trên cấu trúc dữ liệu. Rõ ràng đây chỉ là một phần nhỏ của lập trình chức năng. Nhưng tôi đã thấy rằng đây là một điểm khởi đầu tốt để đưa ý tưởng vào.

Khi đã chìm vào đó, sau đó bạn có thể bắt đầu đào sâu vào những thứ khác (bất biến, không chia sẻ, v.v.)


Sửa chữa: Điều tôi muốn nói là xây dựng trên khái niệm rằng bạn có thể xác định các thuật toán tham số có thể lấy các thuật toán KHÁC làm tham số và thực hiện chúng trên các cấu trúc dữ liệu.
luis.espinal

1

Bất cứ ai có thể cung cấp một số lời khuyên về cách tôi nên tiếp cận điều này?

Chắc chắn rồi:

  • Chọn các ví dụ của bạn một cách cẩn thận để mã F # của bạn không chỉ giải quyết vấn đề một cách thanh lịch mà còn thanh lịch hơn nhiều so với C # / VB . Kết hợp mẫu và suy luận kiểu là bạn bè của bạn ở đây.

  • Sử dụng một ví dụ để nêu bật các lợi ích của tính năng mới được tìm thấy trong F #, ví dụ: quy trình làm việc không đồng bộ, các mẫu hoạt động.

  • Đừng ngại đưa ra các ví dụ không tinh khiết bằng cách sử dụng các cấu trúc dữ liệu có thể thay đổi khi thích hợp. F # là không tinh khiết cho một lý do.

  • Đừng trình bày F # như một liều thuốc chữa bách bệnh. Mô tả các ứng dụng mà F # không phù hợp cũng như các ứng dụng phù hợp hơn nhiều so với các ngôn ngữ .NET khác.

  • Chỉ vào các mẫu đồ chơi mà họ có thể nghiên cứu cũng như các dự án thực tế thành công đã sử dụng F # (Bing AdCenter, Halo 3, v.v.).

  • Giải thích mọi thứ theo cách F # có thể giúp họ giải quyết vấn đề dễ dàng hơn. Tránh tranh luận tôn giáo. Luôn tích cực về F #, không phủ định về các ngôn ngữ khác. Giáp cho họ bằng sự thật và bằng chứng nhưng hãy để họ tự rút ra kết luận.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.