Khi nào, nếu có, tiêu chuẩn mã có thể được bỏ qua? [đóng cửa]


8

Công ty của tôi đã quyết định sử dụng các thủ tục được lưu trữ cho mọi thứ liên quan đến cơ sở dữ liệu (vì họ không biết cách nào khác ngoài SQL thô) và như câu nói "Khi ở Rome ..." nên tôi cố gắng làm theo. Gần đây tôi đã phải thêm một bản sửa lỗi yêu cầu lấy một giá trị cơ sở dữ liệu và vì nó là một giá trị duy nhất từ ​​một bảng duy nhất nên tôi đã viết nó dưới dạng SQL nội tuyến (dĩ nhiên là tham số hóa) vì dường như không cần phải có thủ tục lưu trữ cho một dòng mã tầm thường được sử dụng trong một phần của ứng dụng dưới dạng bùn.

Tất nhiên, giờ đây tôi được yêu cầu sửa nó và chỉ sử dụng Procs được lưu trữ cho mọi thứ liên quan đến cơ sở dữ liệu. Điều này cảm thấy chỉ là một chút quá nhiều như mù quáng theo giáo điều thay vì sử dụng thông thường. Đừng hiểu sai ý tôi, tôi hiểu mục đích của việc có các tiêu chuẩn mã hóa nhưng tôi cũng là người đề xuất bỏ qua các tiêu chuẩn khi chúng không có ý nghĩa, không chỉ mù quáng theo chúng như thể chúng là Tin Mừng.


1
Tôi nghĩ bạn đã đúng, có vẻ như họ đang giáo điều về điều đó. Đặc biệt đối với chỉ đọc, có vẻ như quá mức cần thiết.
GrandmasterB

11
Có lẽ họ không tin tưởng các nhà phát triển của mình để kiểm tra SQL SQL. Có lẽ đăng nhập SQL mà cuối cùng họ sẽ sử dụng sẽ chỉ được phép thực thi Procs lưu trữ thay vì chạy các truy vấn SQL trực tiếp đối với cơ sở dữ liệu. Có lẽ họ muốn một DBA bên thứ 3 xem xét tất cả mã sql để tối ưu hóa và thích các truy vấn DB hơn trong DB, không phải trong ứng dụng. Bạn sẽ không bao giờ biết trừ khi bạn hỏi.
Rachel

2
Bạn đã thử hỏi "Tại sao?" Nếu họ không thể đưa ra một phản hồi tốt hơn thì đó có thể là một mở đầu tốt cho cuộc thảo luận.
TGnat

2
@perdian Tất cả tin đồn đi đâu?
Wayne Molina

2
Chỉ cần bạn đợi cho đến khi ai đó phải mất hàng giờ để biết rằng bạn đã sử dụng một phím tắt trái phép. Đối với các điểm thưởng dành hàng giờ để tìm ra rằng ai đó đã sử dụng một phím tắt trái phép. Mã của bạn đang làm điều gì đó bất ngờ - đừng làm điều đó.

Câu trả lời:


16

Các tiêu chuẩn mã thường chỉ là hướng dẫn. Tuy nhiên, có vẻ như công ty của bạn có chính sách và chính sách thường không thể bỏ qua. Nếu bạn đã đưa nó lên và được yêu cầu sử dụng Thủ tục lưu trữ thay thế, thì tôi sẽ tiếp tục và làm điều đó mặc dù tôi sẽ đưa ra quyết định khác nếu tôi có thẩm quyền.


1
Tôi sẽ, chỉ để giữ cho mọi thứ nhất quán. Chỉ là một điểm của sự thất vọng bởi vì các chính sách không phục vụ mục đích thực sự là IMO ngớ ngẩn. Lý do có nghĩa đen là "Chúng tôi sử dụng các thủ tục được lưu trữ ở đây."
Wayne Molina

@Wayne, tôi đồng ý làm việc vì "Đó là cách chúng tôi làm", luôn là một lý do kém. Đó là bình thường khi tôi đặt câu hỏi cho các giải pháp khác và tìm cách thay đổi quy tắc. Đôi khi tôi thành công, trong khi những lần khác tôi lại nhượng bộ người chịu trách nhiệm cuối cùng cho dự án / nhóm.
jzd

5
Cân bằng cẩn thận ROI của thách thức các tiêu chuẩn. Nếu dành 16 giờ trong các cuộc họp, việc soạn thảo các tài liệu và bản ghi nhớ thay đổi quy trình và nhìn chằm chằm vào màn hình của bạn sẽ khiến bạn nản lòng (đó là 12 trong số 16, btw) giúp bạn tiết kiệm được 10 phút cho công ty. Nếu 16 giờ đó giúp bạn tiết kiệm 10 dự án 8 giờ (ví dụ như viết bài kiểm tra về mã lỗi liên tục), thì điều đó rất khác. Vẫn thiết thực!
corsiKa

@corsiKa: Tôi hoàn toàn đồng ý, nhưng có một vấn đề. Từ một vài lần gặp gỡ đầu tiên, thật khó để thấy mức độ thường xuyên xảy ra sau đó.
Jan Hudec

4

Tôi nghĩ rằng họ thực sự đang cố gắng tách hợp đồng giữa mã ứng dụng và DB. Do đó, nếu họ cần thay đổi tên cột chẳng hạn, họ sẽ chỉ cần đảm bảo các hợp đồng (SP) hoạt động.

Get_Costumer (), hoặc bất cứ điều gì, là một cách để trừu tượng mã ứng dụng khỏi cấu trúc của DB và theo tôi, đó là một thực tiễn tốt nhất thực sự bạn nên xem xét sau đây. Về mặt kiến ​​trúc, bạn hầu như luôn muốn mã DB và mã ứng dụng của mình được tách rời.


3

Thoạt nhìn có vẻ quá cứng nhắc về các hướng dẫn như thế này nhưng tôi nghĩ điều quan trọng là phải tuân thủ các nguyên tắc trừ khi bạn có một lý do rất chính đáng . Tôi nói điều này vì lý thuyết cửa sổ bị hỏng . Điều này đặc biệt đúng nếu bạn có các nhà phát triển cơ sở, những người vẫn cần các thói quen và thói quen tốt được đào sâu vào họ.

Là thực tế rằng sửa chữa của bạn là nhanh chóng hoặc một hack thực sự là một lý do đủ tốt để phá vỡ một cửa sổ?

Hãy xem xét một nhà phát triển thiếu kinh nghiệm duy trì mã của bạn, họ có thể thay đổi truy vấn hoặc thêm một truy vấn khác theo cách tương tự và đột nhiên có một khai thác bảo mật vì họ không nhận ra rằng việc thay đổi truy vấn cũng cần thay đổi cách thực thi.

Lưu ý: Đây là một vấn đề riêng biệt cho dù hướng dẫn có phải là thứ luôn được sử dụng ngay từ đầu hay không, nhưng đó là vấn đề cần xem xét khi thiết lập hướng dẫn. Quan điểm của tôi là một khi bạn đã giải quyết được những điều luôn tốt thì điều quan trọng là phải giữ chúng.


3

RECAP TRÊN TRẢ LỜI KHÁC

Dưới đây là một bản tóm tắt nhanh chóng về những gì người khác đã nói ở đây trước đây.

Chính sách công ty chuyên nghiệp:

  • Cho phép theo dõi các phụ thuộc giữa các đối tượng cơ sở dữ liệu và tổng quan về các thay đổi được lên kế hoạch ảnh hưởng đến lược đồ;
  • Nhóm DBA có thể xem xét và kiểm soát quyền truy cập ứng dụng;
  • Nhóm DBA có thể dự đoán tác động hiệu suất của các thay đổi;
  • Decouples cơ sở dữ liệu từ mã ứng dụng;
  • Lý thuyết cửa sổ bị hỏng ... có nghĩa là cách họ tổ chức mã của họ và phá vỡ tính nhất quán sẽ khiến cơ sở hạ tầng khó nắm bắt hơn đối với người mới, điều này sẽ khiến họ tôn trọng và cố gắng giảm chất lượng;
  • Bạn nhận được tiền lương của bạn để làm những gì bạn được yêu cầu làm. Đây là một chính sách của công ty và ngay bây giờ bạn không có quyền thay đổi nó, vì vậy tốt hơn là sống với nó.

Chính sách của công ty Contra:

  • Tư duy của công ty này rất cứng nhắc và giáo điều, và chính sách này khiến công việc của nhà phát triển trở nên cồng kềnh không cần thiết. Thật không may, xem điểm cuối cùng trong phần Ưu điểm;
  • back2dos đề cập đến nó bằng cách nói "Đối với mọi truy vấn được thực hiện cho cơ sở dữ liệu, bạn phải tra cứu thủ tục được lưu trữ" , chính sách chỉ dành cho sprocs thường dẫn đến sao chép mã, bởi vì các nhà phát triển khác nhau không biết sprocs nào có thể được sử dụng lại cho vấn đề trong tầm tay;
  • Ngoài ra, trớ trêu thay, ngược lại với trường hợp trước cũng tạo ra vấn đề, khi một ứng dụng nào đó sở hữu một sproc, sau đó một ứng dụng khác lại cập nhật nó mà không biết ai khác bắt đầu dựa vào nó. Các DBA theo dõi các phụ thuộc không xa hơn các bức tường của phòng máy chủ DB, vì vậy đừng hy vọng họ sẽ đưa ra một ứng dụng chết tiệt nào dựa trên những gì bên ngoài đó. Nếu các nhóm ứng dụng không theo dõi vấn đề giữa họ thì đó là vấn đề của họ, các DBA sẽ được bảo vệ.

THỨ 2 TRUNG TÂM

Thứ nhất, nhiều câu trả lời ở đây sử dụng từ chuẩn . Việc thực hành cấm truy vấn trực tiếp và chỉ cho phép sprocs không được gọi là tiêu chuẩn. Đó là một chính sách (xem câu trả lời của jzd ).

Thứ hai, cụ thể cho vấn đề của bạn: đối số chính của tôi chống lại chính sách hạn chế sử dụng các thủ tục được lưu trữ này sẽ chỉ là ngôn ngữ SQL và không nhất thiết phải là cơ sở hạ tầng kho lưu trữ logic nghiệp vụ tập trung mà nó thúc đẩy (mặc dù cũng có đối số đối lập) .

SQL là một ngôn ngữ khá cứng nhắc và không thể kết hợp, với sức mạnh biểu cảm khá hạn chế . Điều này có nghĩa là bạn sẽ đi vào ngõ cụt rất sớm liên quan đến khả năng sử dụng lại mã . Một trong những lý do của sự cứng nhắc này là không có cách nào để vượt qua các chức năng hạng nhất theo bất kỳ cách nào (như với các ngôn ngữ OOP sử dụng đa hình), điều này hạn chế đáng kể khả năng kết hợp . Cách gần nhất mà bạn có thể có được đó là sức mạnh biểu cảm là bằng cách viết các truy vấn SQL động được xây dựng bằng cách sử dụng nối chuỗi. Không phải là một điều gọn gàng. Các truy vấn động đánh bại một số điểm trong phần "ưu", như phụ thuộc theo dõi giữa các đối tượng DB và thường có hiệu suất kém hơn, dễ bị lỗi, khó gỡ lỗi và tăngnguy cơ tấn công SQL SQL . Thật không may, với SQL, bạn sẽ thấy rằng bạn không thể tiến xa được với việc trích xuất logic có thể tái sử dụng phổ biến giữa các spro mà không va vào tường và bị buộc phải dùng đến các truy vấn được thực hiện linh hoạt.

CẬP NHẬT: Một hạn chế lớn khác của các thủ tục được lưu trữ, bên cạnh chức năng của lớp thứ nhất, là việc truyền và trả về các kiểu dữ liệu tổng hợp dưới dạng đối số, cho dù đó là danh sách, bộ, bản ghi hoặc cặp giá trị khóa. Điều này làm tổn thương khả năng tổng hợp quá tệ.

Cuối cùng, tôi không nhất thiết phải đồng ý với một trong những điểm chuyên nghiệp ở trên, "tách DB khỏi ứng dụng" của Jorge : Nguyên tắc chính mà tôi cảm thấy áp dụng ở đây là thích cấu trúc dữ liệu nguyên thủy với tập hợp lớn các hoạt động có thể tái sử dụng và có thể kết hợp chung, thay vì làm việc với các API tùy chỉnh . Sprocs là các API tùy chỉnh như vậy ở đây, nằm giữa người dùng và dữ liệu quan hệ nguyên thủy để truy vấn nó bằng cách sử dụng các nguyên hàm thao tác dữ liệu có thể kết hợp phổ biến ( chọn, tham gia, ở đâu, nhóm theo, Vân vân). Bây giờ, bản thân SQL không phải là lựa chọn lý tưởng để trở thành DSL cho các nguyên hàm thao tác dữ liệu có thể tổng hợp, do độ cứng được đề cập ở trên, nhưng với lựa chọn ngôn ngữ hợp lý hơn (như .NET Linq ... hoặc Lisp / Clojure!) Bạn có thể chạy logic đối với một Danh sách đơn giản giống như đối với Kết quả DB. Rõ ràng, điều đó làm cho nó dễ dàng kiểm tra, đó là một điều tốt. Tôi nói thích lưu trữ dữ liệu của bạn là đơn giản và nguyên thủy, sao cho nó có thể được sử dụng với các CSV đơn giản. Như bạn thấy, mô hình này cũng tách DB khỏi ứng dụng, chỉ có điều nó vẽ đường ở mức độ trừu tượng thấp hơn.

PHẢI LÀM GÌ TIẾP THEO?

Có một chút không liên quan đến câu hỏi, nhưng tôi khuyến khích bạn hãy xem Datomic , có một cách tiếp cận mới lạ thú vị để lưu trữ và truy vấn dữ liệu, phù hợp với một số quan sát trên. (Rõ ràng, ý tôi là trước tiên hãy nhìn vào nó bên ngoài môi trường làm việc ... chắc chắn KHÔNG đến văn phòng của CTO vào ngày hôm sau và nói "Này các bạn, tôi đã viết lại một số sprocs của bạn trong Datomic và triển khai nó trên máy chủ prod sáng bóng này ở đó, nó thực sự tuyệt vời hãy xem! " Họ có thể không đánh giá cao sự phấn khích hoàn toàn dễ hiểu khác;)


2

Nơi duy nhất tôi thường xuyên bỏ qua các tiêu chuẩn mã hóa là trong mã được tạo tự động, nếu không, nó thường được xử lý theo từng trường hợp và được kiểm tra hai lần trong đánh giá mã. Bạn không thể là nô lệ cho các tiêu chuẩn mã hóa, nhưng ngoại lệ là khá hiếm trong kinh nghiệm của tôi.


2

Nếu bạn không sử dụng các procs được lưu trữ thì dbas của bạn sẽ thay đổi cấu trúc dữ liệu mà không biết tác động của chúng đến mã nội tuyến của bạn mà họ không biết. Đây là một vấn đề lớn đối với việc bảo trì khi một lập trình viên cao bồi không tuân theo thiết kế. Đây không phải là về tiêu chuẩn mã hóa - đây là về thiết kế. Bạn không phải luôn thích thiết kế hoặc muốn làm theo nó, nhưng đó không phải là cuộc gọi của bạn, vì vậy hãy làm những gì bạn được yêu cầu. Tôi sẽ cho bạn một lượt miễn phí vào một cái gì đó như thế này và sau đó sa thải bạn.


Chúng tôi không có DBA vì vậy đây thực sự là một điểm cần thiết.
Wayne Molina

1
Bỏ qua các quyết định thiết kế có nghĩa là bạn không thể tin tưởng được.
HLGEM

Cách suy nghĩ kỳ lạ; "Quyết định thiết kế" là phúc âm từ Mt. Sinai. Tôi đoán chúng tôi đồng ý không đồng ý. Tôi không có vấn đề gì về việc bỏ qua các quyết định thiết kế khiến cho mã bị lộn xộn và không thể nhầm lẫn (không nhất thiết phải sử dụng các sprocs) so với việc viết mã rõ ràng, súc tích và có thể duy trì.
Wayne Molina

1
@Wayne M - quyết định thiết kế không phải là phúc âm; họ có thể được thay đổi, không phải bởi bạn. Chủ lao động của bạn có thể không có bất kỳ điều gì về việc bỏ qua tiền lương của bạn. Tất cả chúng ta đều tự do sống với quyết định của mình. Tìm một trận chiến tốt hơn.
JeffO

Mặc dù có nhiều lượt tải xuống, tôi đi +1 cho HLGEM - anh ấy đã hiểu đúng. Bạn đang nhận được một mức lương để làm những gì bạn đã nói - bạn muốn làm theo tiêu chuẩn của riêng bạn, mở cửa hàng của riêng bạn ...
Vector

0

Là một lập trình viên lâu năm và trưởng nhóm, tôi phải có khả năng suy nghĩ bên ngoài hộp. Các tiêu chuẩn mã hóa giúp giữ cho mọi thứ tốt đẹp, nhưng khi chúng cản trở, có thể có địa ngục phải trả. Trong trường hợp này, nó phụ thuộc vào định nghĩa của họ về thủ tục. Nếu nó là hạn chế thay vì cho phép thì tùy thuộc vào các khách hàng tiềm năng để chỉ ra nơi nào có vấn đề.


Nó không phụ thuộc vào các khách hàng tiềm năng để chỉ ra các vấn đề mà các tiêu chuẩn giải quyết; tùy thuộc vào bạn để chỉ ra nơi các tiêu chuẩn thực sự gây ra vấn đề. Tôi không thể nhớ bất cứ lúc nào mà các tiêu chuẩn nơi tôi làm việc gây ra cho tôi một rắc rối đáng kể khi làm việc gì đó, ngay cả khi tôi đang suy nghĩ bên ngoài hộp.
David Thornley

0

Chất lượng mã có thể được đo bằng khả năng đọc của nó. Những gì bạn muốn là nhìn vào mã và xem những gì nó làm.

Toàn bộ quan điểm của các tiêu chuẩn mã hóa là thực thi khả năng đọc trên một nhóm, bởi vì bạn muốn xem mã của đồng nghiệp và xem những gì nó làm.
Lý tưởng nhất, điều này dẫn đến mã, mà mọi người đều có thể đọc. Nó giống như mong đợi mọi người nói tiếng Anh sạch sẽ thay vì lẩm bẩm bằng giọng nói của chính họ và viết với một mức độ chính tả và ngữ pháp tốt, thay vì viết mọi thứ bằng lolcat- hoặc leetspeek.

Bây giờ những gì công ty của bạn quan niệm là một tiêu chuẩn không thực thi khả năng đọc trong một nhóm, nó làm giảm nó. Đối với mọi truy vấn được thực hiện cho cơ sở dữ liệu, bạn phải tra cứu thủ tục được lưu trữ.
Điều này giống như mong đợi mọi người thay vì nói những câu bình thường như "Bạn có muốn uống cà phê không?" để nói "Bạn có một e-mail với chủ đề 'Cà phê' trong hộp thư đến của bạn" để liên lạc thông thường. Nó không làm tăng sự hiểu biết trong nhóm của bạn, bởi vì quy trình được lưu trữ (hoặc nội dung của e-mail) có thể hoàn toàn là mumbo-jumbo.

Vì vậy, nó không phải là một tiêu chuẩn mã hóa (hợp lý), mà chỉ là một hình thức ngu ngốc. Điểm duy nhất của các thủ tục ngu ngốc là, chúng giúp hạn chế số lượng nhảm nhí mà một người có thể tạo ra mỗi lần, nhưng họ cản trở những người có đóng góp thực sự.

Bạn nên thử nói chuyện với bất cứ ai chịu trách nhiệm về điều đó (và lịch sự hơn tôi rất nhiều;)).


Tôi rất muốn thoát khỏi các thủ tục được lưu trữ, tin tưởng tôi (tôi nghĩ rằng họ có lợi ích, nhưng thường là quá mức cần thiết). Mã này phụ thuộc rất nhiều vào chúng, tuy nhiên, sẽ không mất gì khi viết lại hoàn toàn để chuyển sang ORM và điều đó sẽ không bao giờ xảy ra.
Wayne Molina

0

Nếu bạn không thể làm cho nó hoạt động, tôi nghĩ bạn sẽ tìm thấy ngoại lệ của mình. Tại một số điểm, nhóm xác định rằng thực hiện nó trong bối cảnh tiêu chuẩn của bạn, chỉ cần nỗ lực quá nhiều hoặc tạo ra một giải pháp kém, bạn tạo ra một ngoại lệ được ghi lại. Bạn thay đổi các tiêu chuẩn khi điều này bắt đầu xảy ra quá thường xuyên.

Bạn chỉ sử dụng điều này làm ví dụ, nhưng việc gói một câu lệnh chọn trong một thủ tục được lưu trữ có thực sự khó khăn không? Bạn rõ ràng nhận được rất nhiều thực hành trong cửa hàng của bạn. Có những tiêu chuẩn khác có lẽ khó theo dõi hơn điều này. Tôi không biết tại sao các lập trình viên không muốn truyền lại điều này cho một dba (tôi biết, không phải trường hợp của bạn.). Cá nhân, sql trong hầu hết các ide lập trình trông giống như crap, nhưng giống như mọi thứ khác, bạn có thể sử dụng nó hoặc bắt đầu sử dụng ORM.


0

Các tiêu chuẩn có thể được bỏ qua trong các trường hợp sau đây:

Khi bạn đã nói chuyện với các nhà phát triển đồng nghiệp của mình và đạt được thỏa thuận hoặc bạn đã đặt ra một chính sách dự định sẽ được thi hành hoặc doanh nghiệp của bạn quyết định rằng việc không tuân theo các tiêu chuẩn là quyết định kinh doanh chính xác (ví dụ: hàng triệu đô la có thể được áp dụng cho một sửa chữa "ngay bây giờ" bất kể nó có mâu thuẫn với các tiêu chuẩn hay không).

Điều này sẽ áp dụng cho các quy tắc nếu;

  • chúng đã bị bỏ qua và lạm dụng đến mức một phần lớn mã không tuân theo chúng.

  • có một số bộ tiêu chuẩn cạnh tranh, và không rõ nên áp dụng.

  • tiêu chuẩn địa phương đi ngược lại với tiêu chuẩn ngành, ví dụ một công ty nói rằng chúng tôi sử dụng 9 khoảng trắng để thụt lề (!)

Nhưng ngay cả trong 3 ví dụ trên, quy tắc VÀNG là, bất cứ khi nào có thể, bạn nói với mọi người liên quan ĐẦU TIÊN. Ít nhất (ví dụ sửa 2 giờ sáng), bạn nên thảo luận về quyết định của mình ngay khi có thể - và thảo luận về nó, không chỉ gửi thông tin về những gì bạn đã làm. Hãy chuẩn bị cho những lời chỉ trích và để thay đổi.


-1

Luôn luôn ổn khi vi phạm các tiêu chuẩn mã hóa; tuy nhiên, khi bạn làm như vậy, bạn nên luôn luôn viết bình luận đề cập rằng vi phạm là có chủ ý và cung cấp một số loại biện minh.

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.